Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

В чем разница между Thread и Runnable?

#java


В чем разница между Thread и Thread (Runnable)?
Иными словами, какой плюс от того, что поток Thread будет реализован через интерфейс
Runnable? Это типа поток в потоке или какие-то доп. функции будут? К примеру, доступ
к UI?..    


Ответы

Ответ 1



@Futurama, в документации совершенно четко прописан ответ на Ваш вопрос. Читаем (жирный шрифт -- это выделено мной): There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be allocated and started. For example, a thread that computes primes larger than a stated value could be written as follows: class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } The following code would then create a thread and start it running: PrimeThread p = new PrimeThread(143); p.start(); Суть в том, что мы переопределяем метод run класса Thread, который вызывается из метода start класса Thread, который мы и вызываем для запуска потока (исполнения нашей программы в новом потоке). The other way to create a thread is to declare a class that implements the Runnable interface. That class then implements the run method. An instance of the class can then be allocated, passed as an argument when creating Thread, and started. The same example in this other style looks like the following: class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } The following code would then create a thread and start it running: PrimeRun p = new PrimeRun(143); new Thread(p).start(); В принципе, как говориться -- "те же яйца, вид сбоку". Если вдуматься, то суть та же. Создается (подготавливается к запуску) новый поток (класс Thread -- структура данных внутри JVM). В эту структуру заносится адрес функции (последовательности инструкций JVM), которая представляет программу, которую мы хотим выполнять в новом потоке. Вызов метода .start класса Thread (непосредственно или опосредовано, как унаследованного в первом случае) запустит новый поток (как именно -- зависит от ОС в которой работает конкретная JVM). Вот собственно и все. Просто RTFM.

Ответ 2



Многопоточность в JAVA отнюдь не ограничена классом Thread В контексте определённой задачи может быть выгоднее наследовать какой-то другой класс, но множественное наследование в JAVA не поддерживается, выход: implements Runnable Интерфейс Runnable имеет посредственное отношение к потокам - его следует расценивать как передаваемую функцию, которая может быть выполнена где-то в другом месте (поток, очередь, класс, метод и т.п.)

Ответ 3



Thread - это абстракция над физическим потоком. Runnable - это абстракция над выполняемой задачей. Плюс использования Runnable состоит в том, что это позволяет логически отделить выполнение задачи от логики управления потоками.

Ответ 4



Runnable - это интерфейс описывающий метод Run, с помощью которого Вы можете передать в другой класс свой код для выполнения. И он никак не связан с Thread, в том смысле, что он не несёт никакой скрытой функциональности. Для выполнения какого-то кода в потоке класс Thread просто использует этот интерфейс как уровень абстракции. Ничего не мешает Вам использовать Runnable любым другим способом. Например, для передачи коллбека. Thread - это класс, который реализует поток и использует интерфейс Runnable для встраивания Вашего кода в поток.

Ответ 5



На мой взгляд смысл в том , что множественное наследование в Ява возможен только от интерфейса и если вам нужно свой класс реализовать от какого то родителя то используете интерфейс Runnable . Если вам нравится и достаточно наследование от класса используете Thread .

Ответ 6



В классе Thread имеется несколько методов, которые можно переопределить в порожденном классе. Из них обязательному переопределению подлежит только метод run(). Этот же метод, безусловно, должен быть определен и при реализации интерфейса Runnable. Некоторые программирующие на Java считают, что создавать подкласс, порожденный от класса Thread, следует только в том случае, если нужно дополнить его новыми функциями. Так, если переопределять любые другие методы из класса Thread не нужно, то можно ограничиться только реализацией интерфейса Runnable. Кроме того, реализация интерфейса Runnable позволяет создаваемому потоку наследовать класс, отличающийся от Thread.

Комментариев нет:

Отправить комментарий