Мы часто одновременно запускаем различные приложения на нашем ПК, одновременно открываем несколько классов в нашей IDE во время работы над программой. Вы когда-нибудь задумывались, как мы можем одновременно открывать несколько вкладок в веб-браузере, ведь мы все любим слушать музыку одновременно, выполняя домашнюю работу?

Это из-за этих понятий называется -

  1. Мультипрограммирование
  2. Многозадачность
  3. Многопроцессорность
  4. Многопоточность

Как работает многопоточность?

Для выполнения программы операционная система должна загрузить программу из вторичного хранилища в основную память. В многопоточном приложении этот один процесс будет иметь несколько потоков внутри. Важно отметить, что в определенное время выполняется только один поток, и между ними происходит переключение контекста. Потоки легко независимы, поэтому на другие потоки не влияет независимо от того, возникает ли исключение во время выполнения одного потока. Если процесс имеет несколько потоков, они будут иметь схожие свойства, такие как код, глобальные и статические переменные, динамическая память кучи и блок управления процессом, единственная разница заключается в пространстве стека. Каждый поток будет иметь свое собственное пространство стека, в котором хранится стек вызовов, поскольку потоки совместно используют пространство памяти процесса, поэтому полезно иметь несколько потоков процесса.

Зачем нам нужна многопоточность?

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

Многопоточность в java

Теперь давайте посмотрим, как реализовать многопоточность в программах JAVA!

В Java жизненный цикл потока включает 5 состояний: новый, активный, заблокированный/ожидающий, ожидающий по времени, завершенный.

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

Мы можем создавать потоки, используя два механизма:

  1. Расширение класса Thread
  2. Реализация работающего интерфейса

Класс Thread содержит несколько методов, таких как start(), run(), sleep(), currentThread(), join(), setPriority() и т. д.

Не волнуйтесь, Java runnable — это не что иное, как интерфейс, используемый для выполнения кода в параллельном потоке. Его можно реализовать в любом классе, который мы хотим запустить как поток. Интерфейс runnable имеет неопределенный метод run(), который имеет тип возвращаемого значения void и не принимает аргументов. Интерфейс Runnable часто используется для переопределения метода run().

Но что делает этот метод run()? И как я могу создать поток, используя эти два механизма?

Давайте обсудим методы start() и run(), чтобы лучше понять эти концепции!

начать()

Создание нового метода выполняется с помощью метода start(). Он запускает выполнение потока, создавая два потока, которые выполняются одновременно.

выполнить()

Метод start() внутренне вызывает метод run(), и выполняется код внутри метода run(). Если мы напрямую вызовем метод run() без метода start(), то поток не будет создан, и метод run() будет выполняться в самом текущем потоке.

[1] Создание потока путем расширения класса Thread:

//Создание нового потока путем расширения класса Thread и start()

класс NewThread расширяет Thread{

public void run() {

System.out.println("метод run() выполнен");

System.out.println("Имя текущего созданного потока: " + Thread.currentThread().getName());}}

открытый класс MainClass{

public static void main(String [] arg) {

Поток NewThread = новый NewThread();

thread.start();}}

Вывод:

Метод start() создает поток с именем по умолчанию Thread-0.

[2] Создание потока путем реализации интерфейса Runnable:

//Создание нового потока путем реализации интерфейса Runnable и start()

класс RunnableThread реализует Runnable {

публичный недействительный запуск () {

System.out.println("Имя текущего созданного потока: " + Thread.currentThread().getName());}}

открытый класс MainThread{

public static void main(String [] arg) {

для (целое i=0; i‹5; i++) {

Поток потока = новый поток (новый RunnableThread());

поток.старт(); }}}

Вывод:

Метод run() переопределяется при реализации интерфейса java.lang.Runnable. Создается экземпляр объекта класса Thread и вызывается метод start().

[3] Вызвать метод run() без метода start():

//Роль start() и run() в многопоточности — Блог

//Создание нового потока путем расширения класса Thread и метода run() без метода //start()

класс RunThread расширяет поток {

публичный недействительный запуск () {

System.out.println("метод run() выполнен");

System.out.println("Имя текущего созданного потока: " + Thread.currentThread().getName());}}

открытый класс MainRun{

public static void main(String [] arg) {

Поток RunThread = новый RunThread();

поток.run();}}

Вывод:

Когда метод start() не вызывается, а вызывается метод run() напрямую, тогда не происходит создания потока, и метод run() выполняется в текущем потоке, то есть в самом основном потоке. Это называется обычным вызовом метода.

[4] Вызов метода start() более одного раза:

//Роль start() и run() в многопоточности — Блог

//Создание потока путем многократного вызова запуска потока

класс StartThread расширяет поток {

публичный недействительный запуск () {

System.out.println("метод run() выполнен");

System.out.println("Имя текущего созданного потока: " + Thread.currentThread().getName());}}

открытый класс MainStart{

public static void main(String [] arg) {

Поток StartThread = новый StartThread();

поток.старт();

поток.start();}}

Вывод:

Примечание. Метод start() нельзя вызывать более одного раза, иначе он вызовет исключение IllegalThreadStateException.

Чтобы создать несколько потоков, мы можем использовать цикл for и указать количество итераций, которые он должен выполнить, в зависимости от количества потоков, которые должны быть созданы.

[5] Совместный вызов методов start() и run():

//Роль start() и run() в многопоточности — Блог

//Создание потока вызовом методов start() и run()

класс CombinedThread расширяет поток {

публичный недействительный запуск () {

System.out.println("метод run() выполнен");

System.out.println("Имя текущего созданного потока: " + Thread.currentThread().getName());}}

открытый класс MainCombined{

public static void main(String [] arg) {

Поток CombinedThread = new CombinedThread();

поток.старт();

поток.run();}}

класс StartThread расширяет поток {

публичный недействительный запуск () {

System.out.println("метод run() выполнен");

System.out.println("Имя текущего созданного потока: " + Thread.currentThread().getName());}}

открытый класс MainStart{

public static void main(String [] arg) {

Поток StartThread = новый StartThread();

поток.старт();

поток.start();}}

Вывод:

Когда метод run() вызывается во второй раз, он выполняется в основном потоке как обычный вызов метода, а не во вновь созданном Thread-0.

ЗАКЛЮЧЕНИЕ

Подведем итог тому, что мы обсуждали выше,

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

Эффективность компьютерного программного обеспечения зависит от его способности обрабатывать инструкции в более быстром темпе. Многопоточные операции помогают достичь этих целей. Одним из плюсов является то, что программирование на Java по своей сути обеспечивает многопоточные средства в рамках кода и упрощает формирование и управление несколькими потоками в Java.

Спасибо, что читаете наш блог…

Блог — Parth Fulsoundar | Теджал Гадад | Шрути Гулакс | Асмита Гитте

Технологический институт Вишвакармы, Пуна.