Метод join
Метод join класса Thread заставляет текущий поток
приостановить выполнение и ждать, пока поток, у которого
вызван этот метод, не завершится. Метод может принимать
необязательный параметр - время ожидания в миллисекундах.
Если поток не завершится за указанное время, управление
вернётся текущему потоку.
Синтаксис
thread.join()
thread.join(millis)
thread.join(millis, nanos)
Пример
Давайте создадим поток, который выводит числа от 1 до 5,
и дождёмся его завершения с помощью join:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread finished");
}
}
Результат выполнения кода:
1
2
3
4
5
"Thread finished"
Пример
Давайте зададим максимальное время ожидания потока
в 100 миллисекунд. Если поток не завершится за это время,
главный поток продолжит работу:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread finished");
});
thread.start();
try {
thread.join(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main finished");
}
}
Результат выполнения кода:
"Main finished"
"Thread finished"
Пример
Давайте дождёмся завершения нескольких потоков,
вызывая join для каждого из них:
public class Main
{
public static void main(String[] args)
{
Thread first = new Thread(() -> {
System.out.println("First thread");
});
Thread second = new Thread(() -> {
System.out.println("Second thread");
});
first.start();
second.start();
try {
first.join();
second.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("All threads finished");
}
}
Результат выполнения кода:
"First thread"
"Second thread"
"All threads finished"