Страницы

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

четверг, 4 октября 2018 г.

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

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


Ответ

@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.

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

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