Нека наблюдаваме някои други разлики между Thread и Runnable с помощта на таблицата за сравнение, показана по-долу:
Сравнителна таблица
Основа за сравнение | нишка | Изпълнима |
---|---|---|
Основен | Всяка нишка създава уникален обект и се свързва с нея. | Множество нишки споделят едни и същи обекти. |
памет | Тъй като всяка нишка създава уникален обект, се изисква повече памет. | Тъй като много нишки споделят един и същ обект, се използва по-малко памет. |
Разширяване | В Java множественото наследяване не е позволено, следователно, след като класът разшири класа Thread, той не може да разшири никой друг клас. | Ако даден клас дефинира нишка, използвайки интерфейса Runnable, той има шанс да разшири един клас. |
употреба | Потребителят трябва да разшири клас потоци само ако иска да замени другите методи в класа Thread. | Ако искате само да специализирате метода на изпълнение, тогава прилагането на Runnable е по-добър вариант. |
съединител | Разширяването на Thread клас въвежда стегнато свързване, тъй като класът съдържа код на Thread class и също заданието, зададено на нишката | Внедряването на Runnable интерфейса въвежда свободно свързване, тъй като кодът на Thread е отделна форма на задачата Threads. |
Дефиниране на клас на нишки
Thread е клас в пакета java.lang . Класът Thread разширява клас Object и изпълнява интерфейси Runnable . Класът Thread има конструктори и методи за създаване и работа с нишката. Когато създаваме множество нишки, всяка нишка създава уникален обект и се свързва с него. Ако създадете нишка разширяващ клас Thread, не можете да разширите никой друг клас, тъй като java не поддържа множествено наследяване. Така че, трябва да изберете да разширите клас Thread, само когато искате да замените някои други методи на Thread class. Нека видим пример за създаване на нишка, разширяваща клас Thread.
/ * Дефиниране на нишка * / Клас Mythread разширява Thread {/ * задание на нишката * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Клас mainThread {/ * задание на основната нишка * / public static void main (String args []) {Mythread mt = new Mythread (); / * основната нишка създаде дънната нишка * / mt.start (); за (int i = 0; i <10; i ++) {System.Out.Print ("Основна нишка"); Изход * / Основна Тема Главна Тема Главна Тема Основна Тема Детска Тема Детска Тема Детска Тема Детска Тема Основна Тема Детска Тема Основна Тема Основна Тема Детска Тема Детска Тема Основна Тема Основна Тема Детска Тема Детска Тема Основна Тема
В горния код създавам клас Mythread, който разширява класа Thread и замества метода за изпълнение на Thread class. В класа, съдържащ основния метод, създавам обект за конци (mt) от класа Mythread и използвайки обектът thread, извика метода start (). Методът start стартира изпълнението на нишката и в същото време JVM извиква метода на изпълнение на нишката. Сега има две нишки в програмата - една основна нишка и втора нишка, създадена от главната нишка. Изпълнението на двете нишки се извършва едновременно, но точния изход не може да се претендира.
Дефиниция на изпълним интерфейс
Runnable е интерфейс в java.lang пакет. Прилагайки Runnable интерфейс можем да дефинираме нишка. Runnable интерфейс има един метод run (), който се изпълнява от класа, който изпълнява Runnable интерфейс. Когато решите да дефинирате нишка, използвайки интерфейс Runnable, все още имате избор да разширите всеки друг клас. Когато създавате няколко нишки чрез прилагане на изпълним интерфейс, всяка нишка споделя един и същ изпълним пример. нека се научим как да дефинираме нишка, използвайки интерфейс Runnable.
/ * Дефиниране на нишка * / Клас Runnablethread реализира Runnable {/ * задача на нишката * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Клас mainThread {/ * задание на основната нишка * / public static void main (String args []) {Mythread rt = new Mythread (); / * основната нишка създаде изпълним обект * / Thread t = new Thread (rt); / * основната нишка създава детски нишки и предава обекта, който може да се изпълни * / t.start (); за (int i = 0; i <10; i ++) {System.Out.Print ("Основна нишка"); Изход * / Основна Тема Главна Тема Главна Тема Основна Тема Детска Тема Детска Тема Детска Тема Детска Тема Основна Тема Детска Тема Основна Тема Основна Тема Детска Тема Детска Тема Основна Тема Основна Тема Детска Тема Детска Тема Основна Тема
В горния код създадох клас Runnablethread, който изпълнява Runnable интерфейс и дефинира задачата на нишката чрез прилагане на метода run () на интерфейса Runnable. След това създавам клас mainthread, съдържащ основния метод. Вътре в основния метод, аз обявих изпълним обект от класа Runnablethread и предадох този обект на конструктора на Thread, докато декларирахме нишка. По този начин аз свързах обекта на нишката (t) с изпълним обект (rt). Тогава обектът нишка извиква метода на стартиране на нишката, която по-нататък извиква метода на изпълнение на класа Runnablethread. Ако не бях свързал изпълним обект с обект Thread, тогава методът за стартиране на нишки щеше да извика метода на изпълнение на Thread клас. Сега, отново има два потока в кода, основната нишка и главната нишка създават детски конец, които се изпълняват едновременно, но точната продукция никога не може да се претендира.
Ключови разлики между нишка и изпълняеми в Java
- Всяка нишка, създадена чрез разширяване на класа Thread, създава уникален за нея обект и се асоциира с него. От друга страна, всяка нишка, създадена чрез реализирането на интерфейс за изпълнение, споделят един и същ изпълним пример.
- Тъй като всяка нишка е асоциирана с уникален обект, когато е създаден чрез разширяване на клас Thread, се изисква повече памет. От друга страна, всяка нишка, създадена чрез прилагане на Runnable интерфейс споделя същото пространство на обекта, следователно, тя изисква по-малко памет.
- Ако разширите класа Thread след това, можете да наследите всеки друг клас, тъй като Java не разрешава многократно наследяване, докато прилагането на Runnable все още дава шанс на клас да наследи всеки друг клас.
- Човек трябва да разшири клас Thread само ако трябва да замени или специализира някои други методи на Thread class. Трябва да приложите интерфейс, който може да се изпълни, само ако искате само да специализирате метода на изпълнение.
- Разширяването на класа Thread въвежда строго свързване в кода, тъй като кодът на Thread и заданието на нишката се съдържат в един и същи клас. От друга страна, внедряването на Runnable интерфейс въвежда свободно свързване в кода, тъй като кодът на Thread е seprate от заданието, зададено на нишката.
Заключение:
Предпочита се да се приложи интерфейс Runnable, вместо да се разширява клас Thread. С внедряването на Runnable кодът ви се свързва свободно, тъй като кодът на нишката е различен от този, който присвоява задание на нишката. Тя изисква по-малко памет и също така позволява на клас да наследи всеки друг клас.