чому існує два способи використання потоку в java?

Я знаю, що два способи використання нитки в java:

  1. запустити Runable
  2. розширити тему

Я також знаю, що впровадження Runable краще, ніж розширення потоку .

Але чому існує два способи - чому не тільки один?

Якщо реалізація Runnable є кращим підходом, чому існує ще один варіант?

Що було б неправильно, маючи лише один варіант?

8
додано Автор jahroy, джерело
додано Автор Aarun, джерело

10 Відповіді

  • extends Thread:

    your thread creates unique object and associate with it

  • implements Runnable:

    it shares the same object to multiple threads

Інша річ, щоб відзначити, оскільки ви можете розширити лише один клас в Java, якщо ви розширюєте Thread , ви не можете розширити новий клас. Якщо ви вирішите implement Runnable , ви можете розширити клас потім.

14
додано

Технічно є лише один спосіб: виконати Runnable . Thread , до речі, це робить саме так, тому, розширюючи його, ви тривіально задовольняєте вимогу інтерфейсу.

7
додано

Клас підкатегорії Thread дозволяє вам змінювати інші перевизнавані функції класу Thread , якщо ви хочете це зробити. Ви, мабуть, не повинні.

Крім того, підклас класу Thread може призвести до більш читаного коду, де іноді в вашому підкласі може бути ваш власний користувальницький API. Можна уявити такі класи, як "DownloadingThread", "RenderingThread" тощо.

2
додано

Використання Thread як завдання забезпечує компактний спосіб створення та запуску паралельного потоку

new Thread() {
    public void run() {
        ...
    }
}.start();
2
додано

Навіть якщо ви реалізуєте інтерфейс Runnable, вам потрібно буде створити потоку, щоб завдання виконувалося як гілка. Очевидні переваги, які ви отримуєте від реалізації Runnable, є

  1. Ви маєте право продовжити будь-який інший клас
  2. Ви можете реалізувати більше інтерфейсів
  3. Ви можете використовувати вбудовану версію в пул потоків

Розширення класу Thread є лише одним із варіантів, оскільки він реалізує Runnable всередині, таким чином ви побічно впроваджуєте Runnable інтерфейс. Справа в тому, що цей клас не був зроблений остаточно, щоб розробники не могли його розширити. Як згадує Джошуа Блох в "Ефективній Java", не повинно бути ніяких підстав продовжувати Thread зазвичай

2
додано

Ще одна причина, чому ми використовуємо кожен тип потоку.

Розширення класу Thread не дасть вам можливості продовжити будь-який інший клас. Але якщо ви реалізуєте інтерфейс Runnable , ви можете розширити інші класи у своєму класі.

Отже, залежно від вимог до дизайну, ви можете скористатися будь-яким з методів.

2
додано

Обидва методи мають різні підходи. Впровадження інтерфейсу Runnable не дає жодного контролю над потоком. І якщо ми розширюємо клас thread, то похідний клас не може розширити жодного іншого базового класу.

Отже, якщо користувач хоче повністю керувати програмою, то клас розширення Thread буде кращим варіантом, і якщо користувач бажає гнучкості розширення інших базових класів, то реалізація Runnable інтерфейсу є хорошим варіантом.

2
додано

Коли ми створюємо потік за допомогою реалізованих програм, ми не ініціалізуємо будь-яке значення під час створення потоку. Але коли ми розширюємо клас Thread для створення потоку, ми можемо ініціалізувати деяке значення, якщо необхідно, використовуючи перевагу конструктора як follw

public class MyThread extends Thread
{
 int aValue;
 public Mythread(int aValue)
 {
 this.aValue = aValue; 
 }
 ............................
 ............................

}

Коли ми створюємо нитку, ми можемо ініціалізувати такий спосіб

MyThread t = new MyThread(7);
t.start();

Окрім того, оскільки Java не підтримує Multiple inheritance, то, якщо ми розширюємо клас Thread, то ми втратили нашу можливість розширити інший клас. Отже, у цьому сценарії руйнівний інтерфейс настільки корисний для створення потоку

1
додано
Спасибі .. за коментарі. Це також важливий термін питання.
додано Автор TKumar, джерело
-1 Ви можете точно ініціалізувати змінні в класах, які реалізують Runnable. Ось стаття з прикладом. Також варто прочитати пояснення переваг і відмінностей між " реалізацією Runnable " проти " розширення теми ".
додано Автор jahroy, джерело

У більшості випадків ми використовуємо графічний інтерфейс. Тому що це дозволяє нам більш гнучко використовувати структуру та функціональність. Java дозволяє кілька спадщин для інтерфейсу. Ця концепція використовується досить багато в дизайні програмного забезпечення.

До речі, існує інший інтерфейс, який називається callable. Клас, що викликається, може повернути значення у тип V, а також може викинути перевірені винятки.

1
додано

Розширюючи Thread, у кожного з ваших потоків є унікальний об'єкт, пов'язаний з ним, тоді як реалізація Runnable, багато потоків можуть використовувати один і той самий пробний екземпляр.

1
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників