2013-06-26 2 views
9

Я знаю, что есть два способа использовать поток в Java:Почему есть два способа использования потока в java?

  1. реализует Runable
  2. продлить тему

Я также знаю реализацию Runable лучше, чем расширение тему.

Но почему есть два пути - почему не только один?

Если внедрение Runnable - лучший подход, почему есть другой вариант?

Что было бы неправильно, если у вас был только один вариант?

+0

http://stackoverflow.com/questions/541487/ реали ments-runnable-vs-extends-thread? lq = 1 проверить это. – Aarun

+0

Вот [хорошая статья ...] (http://www.java-forums.org/blogs/java-tip/340-creating-thread-implementing-java-runnable-interface.html) – jahroy

ответ

14
  • extends Thread:

    ваш поток создает уникальный объект и связать с ним

  • implements Runnable:

    он разделяет же объекта нескольких потоков

Еще одно замечание, поскольку вы можете расширить только один класс на Java, если вы extends Thread, вы не можете продлить другой класс. Если вы выберете implement Runnable, вы можете продлить класс.

7

Технически, существует только один способ: осуществить Runnable. Thread, кстати, делает именно это, поэтому, расширяя его, вы тривиально удовлетворяете требованиям интерфейса.

2

Класс подкласса Thread позволяет вам изменять другие функции защиты от Thread, если вы хотите это сделать. Вы, наверное, не должны.

Кроме того, класс подкласса Thread может приводить к появлению более читаемого кода, когда в вашем подклассе вы можете иметь свой собственный API. Можно представить себе такие классы, как DownloadingThread, RenderingThread и т. Д., Расширяющие Thread.

2

Еще одна причина, по которой мы используем каждый тип резьбы.

Расширение Thread класс не даст вам возможность расширить любой другой класс. Но если вы реализуете интерфейс Runnable, вы можете расширить другие классы в своем классе.

Так что, в зависимости от вашего требования к дизайну, вы можете использовать любой из мнтодов.

1

В большинстве случаев мы используем управляемый интерфейс. Потому что это позволяет нам более гибко относиться к структуре и функциональности. Java допускает множественное наследование для интерфейса. Эта концепция используется довольно много в Software Design.

Кстати, есть другой интерфейс, называемый вызываемым. Класс, подлежащий вызову, может возвращать значение в типе V, а также может выдавать проверенные исключения.

2

Использование темы, как задача обеспечивает компактный способ создания и запуск параллельной резьбы

new Thread() { 
    public void run() { 
     ... 
    } 
}.start(); 
2

Оба метода имеют разные подходы. Внедрение интерфейса Runnable не дает никакого контроля над потоком. И если мы расширяем класс потоков, то производный класс не может распространять какой-либо другой базовый класс.

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

2

Даже если вы реализуете интерфейс Runnable, вам нужно создать поток, чтобы ваша задача выполнялась как поток. Очевидные преимущества вы получите из реализации Runnable являются

  1. Вы свободу расширить любой другой класс
  2. Вы можете реализовать несколько интерфейсов
  3. Вы можете использовать вас Runnable реализацию в пулы потоков

Расширение темы class - это просто вариант, поскольку он реализует Runnable внутренне, чтобы вы в конечном итоге реализовали интерфейс Runnable косвенно. Просто, чтобы этот класс не был окончательным, чтобы разработчики не расширили его. Поскольку Джошуа Блох упоминает в «Эффективной Java», что не должно быть причин для расширения Thread обычно

1

Расширяя Thread, каждый из ваших потоков имеет уникальный объект, связанный с ним, тогда как при реализации Runnable многие потоки могут совместно использовать один и тот же runnable пример.

1

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

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

} 

Когда мы создаем нить можно инициализировать, как следовать

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

Кроме этого, поскольку java не поддерживает множественное наследование, поэтому мы, если расширяет класс Thread, тогда мы потеряли возможность расширять другой класс. В этом сценарии runnable интерфейс настолько полезен для создания потока

+0

Спасибо .. для комментариев. Это также важный вопрос. – TKumar

+0

-1 Вы можете определенно инициализировать переменные в классах, которые реализуют Runnable. Ниже приведен пример [статьи] (http://www.java-forums.org/blogs/java-tip/340-creating-thread-implementing-java-runnable-interface.html). Также стоит прочитать для объяснения преимуществ и различий между «_implementing Runnable_» ** vs ** «_extending Thread_». – jahroy

Смежные вопросы