Рекомендуем, 2020

Выбор редакции

Разница между классом потока и исполняемым интерфейсом в Java

Поток может быть определен двумя способами. Во-первых, путем расширения класса Thread, в котором уже реализован интерфейс Runnable. Во-вторых, путем непосредственной реализации интерфейса Runnable . Когда вы определяете поток, расширяя класс Thread, вы должны переопределить метод run () в классе Thread. Когда вы определяете поток, реализующий интерфейс Runnable, вы должны реализовать единственный метод run () интерфейса Runnable. Основное различие между Thread и Runnable состоит в том, что каждый поток, определенный расширением класса Thread, создает уникальный объект и связывается с этим объектом. С другой стороны, каждый поток, определенный реализацией интерфейса Runnable, использует один и тот же объект.

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

Сравнительная таблица

Основа для сравненияНитьRunnable
основнойКаждый поток создает уникальный объект и связывается с ним.Несколько потоков совместно используют одни и те же объекты.
объем памятиПоскольку каждый поток создает уникальный объект, требуется больше памяти.Поскольку несколько потоков используют один и тот же объект, используется меньше памяти.
простирающийсяВ Java множественное наследование не допускается, следовательно, после того, как класс расширяет класс Thread, он не может расширять любой другой класс.Если класс определяет поток, реализующий интерфейс Runnable, у него есть шанс расширить один класс.
использованиеПользователь должен расширять класс потока, только если он хочет переопределить другие методы в классе потока.Если вы хотите специализировать только метод run, лучше использовать Runnable.
СвязьРасширение класса Thread вводит тесную связь, поскольку класс содержит код класса Thread, а также задание, назначенное потоку.Реализация интерфейса Runnable вводит слабую связь, так как код Thread является отдельным от работы Threads.

Определение класса потока

Поток - это класс в пакете java.lang . Класс Thread расширяет класс Object и реализует интерфейсы Runnable . Класс Thread имеет конструкторы и методы для создания и работы с потоком. Когда мы создаем несколько потоков, каждый поток создает уникальный объект и связывается с этим объектом. Если вы создаете поток, расширяющий класс Thread, в дальнейшем вы не сможете расширить любой другой класс, так как java не поддерживает множественное наследование. Поэтому вы должны расширять класс Thread только тогда, когда вы также хотите переопределить некоторые другие методы класса Thread. Давайте посмотрим на пример создания потока, расширяющего класс Thread.

 / * Определение потока * / Класс Mythread расширяет поток {/ * задание потока * / 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 (); for (int i = 0; i <10; i ++) {System.Out.Print ("Основной поток"); }}} / * Вывод * / основная тема Основная тема Основная тема Основная тема Детская тема Детская тема Основная тема Детская тема Основная тема Детская тема Основная тема Основная тема Детская тема Основная тема Основная тема Детская тема Основная тема Детская тема Основная тема 

В приведенном выше коде я создаю класс Mythread, который расширяет класс Thread и переопределяет метод run класса Thread. В классе, содержащем метод main, я создаю объект потока (mt) класса Mythread и с помощью объекта потока вызывал метод start (). Метод start запускает выполнение потока, и в то же время JVM вызывает метод run потока. Теперь в программе есть два потока: один основной поток и второй дочерний поток, созданный основным потоком. Выполнение обоих потоков происходит одновременно, но точный вывод не может быть притворным.

Определение работоспособного интерфейса

Runnable - это интерфейс в пакете java.lang . Реализуя интерфейс Runnable, мы можем определить поток. Интерфейс Runnable имеет единственный метод run (), который реализуется классом, реализующим интерфейс Runnable. Когда вы решите определить поток, реализующий интерфейс Runnable, у вас все еще есть возможность расширить любой другой класс. Когда вы создаете несколько потоков с помощью интерфейса 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 (); for (int i = 0; i <10; i ++) {System.Out.Print ("Основной поток"); }}} / * Вывод * / основная тема Основная тема Основная тема Основная тема Детская тема Детская тема Основная тема Детская тема Основная тема Детская тема Основная тема Основная тема Детская тема Основная тема Основная тема Детская тема Основная тема Детская тема Основная тема 

В приведенном выше коде я создал класс Runnablethread, который реализует интерфейс Runnable и определяет работу потока, реализуя метод run () интерфейса Runnable. Затем я создаю класс mainthread, содержащий метод main. Внутри метода main я объявил объект runnable класса Runnablethread и передал этот объект конструктору Thread при объявлении потока. Таким образом, я связал объект потока (t) с работающим объектом (rt). Затем объект потока вызывает метод запуска потока, который далее вызывает метод запуска класса Runnablethread. Если бы я не связал работающий объект с объектом Thread, тогда метод запуска потоков вызвал бы метод run класса Thread. Теперь, опять же, в коде есть два потока: основной поток и основной поток создают дочерний поток, и оба выполняются одновременно, но точный вывод никогда не может быть притворен.

Ключевые различия между Thread и Runnable в Java

  1. Каждый поток, созданный путем расширения класса Thread, создает для него уникальный объект и связывается с ним. С другой стороны, каждый поток, созданный путем реализации интерфейса Runnable, совместно использует один и тот же экземпляр runnable.
  2. Поскольку каждый поток связан с уникальным объектом при создании путем расширения класса Thread, требуется больше памяти. С другой стороны, каждый поток, созданный посредством реализации интерфейса Runnable, использует одно и то же пространство объектов, следовательно, ему требуется меньше памяти.
  3. Если вы расширите класс Thread, то далее вы можете унаследовать любой другой класс, поскольку Java не допускает множественного наследования, тогда как реализация Runnable по-прежнему дает возможность классу наследовать любой другой класс.
  4. Класс Thread следует расширять только в том случае, если он должен переопределять или специализировать некоторые другие методы класса Thread. Вы должны реализовать интерфейс Runnable, если хотите только специализировать метод run.
  5. Расширение класса Thread вводит тесную связь в коде, поскольку код Thread и задание потока содержатся в одном и том же классе. С другой стороны, реализующий интерфейс Runnable вводит слабую связь в коде, поскольку код Thread отделен от задания, назначенного потоку.

Заключение:

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

Top