Многопоточность Flashcards
(7 cards)
Как запустить задачу в другом потоке
Runnable task = () -> {
// здесь пишем код, который хотим выполнить в другом потоке
};
Thread thread = new Thread(task);
thread.start();
================================
Runnable task1 = () -> {
for (int i = 1; i <= 5; i++)
};
Runnable task2 = () -> {
for (int i = 10; i <= 14; i++) {
};
Thread th-1 = new Thread(task1); Thread th-2 = new Thread(task2); th-1.start(); th-2.start();
Как сообщить потоку, что мы от него хотим
- Передать экземпляр Runnable
Thread t = new Thread(() -> println(“Hello”)); - Сделать наследника от класса Thread и переопределить метод run:
public class MyThread extends Thread {
public void run() {println(“Hello”); }
}
Thread thread = new MyThread();
Запуск кода в Thread
thread.run() - просто выполнится код внутри метода без создания нового потока.
t.start() - создается новый поток и выполняется код из метода run()
Виды потоков
- Обычные (User Thread)
Пока в JVM есть хотя бы один обычный поток, JVM продолжает работу. - Фоновые (Daemon Thread)
Фоновый поток, который завершится, когда завершатся все пользовательские потоки. Пример: сборщик мусора.
Признак выставляется до старта потока с помощью метода setDaemon:
Метод join()
Метод join() в Java используется для того, чтобы приостановить выполнение текущего потока до тех пор, пока не завершится другой поток.
Когда один поток вызывает join() для другого потока, он переходит в состояние ожидания до тех пор, пока целевой поток не завершит свою работу.
Можно добавить аргумент, сколько времени ждать.
Где используется на практике:
= Ожидание завершения работы фонового потока перед завершением программы.
= Последовательное выполнение задач, когда нужно точно дождаться окончания одной, прежде чем начать другую.
= В тестах, когда нужно дождаться завершения потока перед проверкой результата.
Метод sleep()
Приостанавливает выполнение текущего потока (того, в котором вызывается метод) на указанный промежуток времени, позволяя другим потокам продолжать работу.
sleep() является статическим, поэтому вызывается через класс Thread (например, Thread.sleep(1000)), а не через объект потока.