В Java Process и Thread являются двумя основными единицами исполнения в многопоточном приложении.

Java Thread

Процессы(Process)

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

Потоки(Thread)

Поток можно представить как облегчённую версию процесса. Для создания нового поток нужно меньшее количество ресурсов чем для создания нового процесса.

О потоках в Java

Каждое приложение написанное на Java  имеет минимум один поток — main thread. Хотя так же в Java выполняются и системные, фоновые потоки типа: менеджера памяти, системного менеджера, обработчика сигналов и т.д. Но тем не менее в Java, точкой старта является статический метод main из которого уже можно запустить новые потоки.


Многопоточность указывает на то что в одной программе обрабатываются два или более потока. Компьютер имеющий одно ядро в процессоре, может в один момент времени исполняться только один поток , либо при помощи time slicing из функционала ОС потоки могут выполняться по переменно, разделяя процессорное время на выполнения потока.

Преимущества потоков(Thread) в Java

  1. Потоки в Java более легковесны по сравнению с процессами. Для создания потока требуется меньше времени и ресурсов.
  2. У потока есть доступ к данным и коду родительского процесса.
  3. Переключение между потоками более простая операция чем переключение между процессами.
  4. Обмен данными между потоками более простой чем между процессами.

Для создания нового потока в Java существуют два способа:

  1. При помощи реализации через интерфейс java.lang.Runnable
  2. Через наследование класса java.lang.Thread

Пример реализации через интерфейс java.lang.Runnable

Для создание класса «runnable«, необходимо реализовать java.lang.Runnable, для получения возможности доступа к методу public void run(). Для того что бы воспользоваться данным классом, необходимо создать новый экземпляр этого класса, затем при помощи метода start(), запустить на выполнение в отдельном потоке метод run().

Пример кода:

Пример реализации через класс наследование класса Thread

Для создания необходимого класса можно унаследоваться от java.lang.Thread. Затем переопределить метод run(), создать объект экземпляра этого класса и запустить при помощи метода start().

Далее приведён пример вызова ранее созданных классов:

Результат выполнения:

После запуска программы порядок исполнения потоков будет зависеть от того как ОС распределит процессорное время на выполнение каждого из потоков.
Однако можно при создании потока назначить приоритет в для определения порядка выполнения, но даже это не гарантирует что потоки будут выполняться в необходимом порядке.

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

Runnable vs Thread

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

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

 

One thought on “Java Thread”

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

18 + 5 =