Ответ
Метод join() обеспечивает синхронизацию потоков, заставляя вызывающий поток ожидать завершения потока, для которого вызван join().
Основное назначение:
- Гарантировать, что определенный поток завершит выполнение до продолжения работы текущего потока.
- Координация порядка выполнения в многопоточных приложениях.
Пример использования:
Thread backgroundThread = new Thread(() -> {
System.out.println("Фоновый поток: начало работы");
try {
Thread.sleep(3000); // Имитация длительной операции
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Фоновый поток: завершение");
});
backgroundThread.start();
System.out.println("Основной поток: запустил фоновый и ждёт его завершения...");
backgroundThread.join(); // Основной поток блокируется здесь
System.out.println("Основной поток: продолжает работу после join()");
Ключевые особенности:
- Блокировка: Вызывающий поток переходит в состояние
WAITING. - Перегрузки:
join(long millis)иjoin(long millis, int nanos)позволяют задать максимальное время ожидания. - Исключение: Метод бросает
InterruptedException, если ожидающий поток будет прерван. - Немедленный возврат: Если целевой поток уже завершён или не был запущен,
join()возвращает управление немедленно.
Типичные сценарии: ожидание завершения пула рабочих потоков, обеспечение порядка финализации, синхронизация при запуске-остановке сервисов.