Как работает многопоточность java [дубликат]

121
15 марта 2022, 03:10
На этот вопрос уже дан ответ здесь:
Многопоточность в java, почему порядок вывода результата разнится? (1 ответ)
Закрыт 1 год назад.

Объясните пожалуйста буквально на пальцах, простыми словами, как работает многопоточность в java.. Есть вопросы на которые я не могу найти ТОЧНЫЙ ответ, из-за чего возникает расплывчатое понимание материала. Вопрос такой, у нас есть два объекта разных типов с переопределенными методами run(), и один поток Thread, можно ли их поместить в выполнение одного потока, и могут ли они они исполняться именно одновременно? или эти два метода в потоке будут попеременно выполняться?

И вообще, объясните краткими словами тему)про всякие методы wait() и notify() читал.

Answer 1

Метод run() тянется из интерфейса Runnable(), который реализуется классом Thread.

Thread - это и есть класс потока.

Метод run() - это тот метод который начнет выполняться при старте потока. Как только все действия описанные в методе run() выполнится - поток завершится.

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

Потоки применяют либо чтоб ускорить выполнение каких либо действий, либо если можно какие-то действия выполнять отдельно от основного потока (например построение отчета, который долго считается, или отправка писем или ...)

Поток можно создать так

 public class MyThread extends Thread{
     @Override
     public void run(){
        ...
     }
 }
 //Тогда создание экземпляра будет выглядеть так
 ...
 Thread myThread = new MyThread();
 myThread.start(); //запуск потока
 ...

или так

 public class MyRunnable implements Runnable{
     @Override
     public void run(){
        ...
     }
 }
 //Тогда создание экземпляра будет выглядеть так
 ...
 Thread myThread = new MyThread( new MyRunnable() );
 myThread.start(); //запуск потока
 ...
Answer 2

Поток - это последовательность исполняемых команд. В Jav'e - команд, размещенных в методе run(). Поэтому один поток - один метод run(). Для двух методов run() нужны два потока. Или один, но с другим метолом run():

public void run() {
  object1.run(); 
  object2.run();
}

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

Методологически поток - это виртуальный процессор. Сейчас с помощью технологии виртуализации можно один компьютер разбить на несколько виртуальных машин и на каждую поставить собственную операционную систему. Аналогично, аппаратный процессор можно разбить на несколько виртуальных процессоров - потоков, и на каждом запустить свою программу. Для этого есть техника переключения процессора с одного потока на другой. Но техники переключения потока с одного метода на другой не сделали, потому что нет смысла.

READ ALSO
Как преобразовать одномерный массив в дву-мерный

Как преобразовать одномерный массив в дву-мерный

Допустим у меня есть одномерный массив

101
Как заблокировать все кнопки при нажатии одной из них?

Как заблокировать все кнопки при нажатии одной из них?

Мне нужно блокировать кнопки после нажатия любой из них на 5 секундКак я могу это сделать? Именно на 5 вроде через Thread

101
реализация работы плагинов на php

реализация работы плагинов на php

Начал изучать php и столкнулся с проблемойВот я хочу чтобы к моей странице можно было подключить любое количество плагинов

75