Пример использования метода join() в потоках Java

Метод join потока Java может быть использован для приостановки выполнения текущего потока до тех пор, пока указанный поток не завершится. Существует три перегруженных функции join.

Метод join потока Java

public final void join(): Этот метод join потока Java ставит текущий поток в ожидание, пока вызывающий его поток не завершится. Если поток прерывается, он генерирует InterruptedException. public final synchronized void join(long millis): Этот метод join потока Java используется для ожидания завершения потока, на котором он вызван, или ожидания указанное количество миллисекунд. Поскольку выполнение потока зависит от реализации ОС, не гарантируется, что текущий поток будет ожидать только заданное время. public final synchronized void join(long millis, int nanos): Этот метод join потока Java используется для ожидания завершения потока в течение указанных миллисекунд плюс наносекунд. Вот простой пример использования методов join потока. Цель программы – убедиться, что основной поток завершается последним, и третий поток начинает выполнение только тогда, когда первый завершится.

package com.journaldev.threads;

public class ThreadJoinExample {

    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable(), "t1");
        Thread t2 = new Thread(new MyRunnable(), "t2");
        Thread t3 = new Thread(new MyRunnable(), "t3");
        
        t1.start();
        
        //начать второй поток после ожидания 2 секунды или если он завершен
        try {
            t1.join(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        t2.start();
        
        //начать третий поток только тогда, когда первый поток завершен
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        t3.start();
        
        //дождаться завершения всех потоков перед завершением основного потока
        try {
            t1.join();
            t2.join();
            t3.join();
        } catch (InterruptedException e) {
            //TODO Автоматически сгенерированный блок перехвата
            e.printStackTrace();
        }
        
        System.out.println("All threads are dead, exiting main thread");
    }

}

class MyRunnable implements Runnable{

    @Override
    public void run() {
        System.out.println("Thread started:::"+Thread.currentThread().getName());
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread ended:::"+Thread.currentThread().getName());
    }
    
}

Вывод вышеуказанной программы:

Thread started:::t1
Thread started:::t2
Thread ended:::t1
Thread started:::t3
Thread ended:::t2
Thread ended:::t3
All threads are dead, exiting main thread

Вот и все для быстрого обзора примера использования потока в Java.

Source:
https://www.digitalocean.com/community/tutorials/java-thread-join-example