— Привіт, Аміго! Я бачу, ти робиш великі успіхи у вивченні потоків.

— Це виявилось нескладно.

— Так це ж чудово! Сьогодні легкий урок, і тема цього уроку – метод join.

Уяви собі ситуацію: головний потік створив дочірній потік для виконання якогось завдання. Минає час, і головному потокові знадобилися результати роботи того дочірнього потоку. А дочерній потік ще не закінчив свою роботу. Що робити головному потокові?

— Так, що робити головному потокові?

— Для цього є метод join. Сенс його в наступному. Один потік чекає, поки повністю завершиться робота другого потоку:

Код Опис
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Клас, який реалізує інтерфейс Runnable.
public static void main(String[] args)
{
Printer printer1 = new Printer("Микола");
Thread thread1 = new Thread(printer1);
thread1.start();

thread1.join();
}
Головний потік створює дочірній потік – об'єкт thread1.

Потім запускає його – виклик thread1.start();

І чекає на його завершення – thread1.join();

Один потік може викликати метод join в об'єкта другого потоку. В результаті перший потік (який викликав метод) призупиняє свою роботу до закінчення роботи другого потоку (об'єкт якого викликано методом).

Тут варто розрізняти дві речі: є, власне, потік – окремий процес виконання команд, а є об'єкт цього потоку (об'єкт Thread).

— І це все?

— Так.

— А навіщо потрібно створювати потік і одразу ж чекати на його завершення?

— Одразу може й не потрібно. А ось через якийсь час це може і знадобиться. Головний потік після запуску першого дочірнього потоку може роздати ще багато завдань іншим потокам (створивши їх і викликавши метод start), а потім все – роботи йому більше не залишилося, потрібно опрацьовувати результати роботи першого дочірнього потоку. У таких випадках, коли потрібно обов'язково дочекатися завершення роботи іншого потоку, і потрібно викликати метод join.

— Зрозуміло.