Для чего используется метод join() класса Thread в Java?

«Для чего используется метод join() класса Thread в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод 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()");

Ключевые особенности:

  1. Блокировка: Вызывающий поток переходит в состояние WAITING.
  2. Перегрузки: join(long millis) и join(long millis, int nanos) позволяют задать максимальное время ожидания.
  3. Исключение: Метод бросает InterruptedException, если ожидающий поток будет прерван.
  4. Немедленный возврат: Если целевой поток уже завершён или не был запущен, join() возвращает управление немедленно.

Типичные сценарии: ожидание завершения пула рабочих потоков, обеспечение порядка финализации, синхронизация при запуске-остановке сервисов.