https://www.baeldung.com/java-thread-join

1. 概述

在本教程中,我们将讨论Thread类中的 不同*join()*方法。我们将详细介绍这些方法和一些示例代码。

与wait()notify()方法类似 ,*join()*是另一种线程间同步机制。

您可以快速浏览本教程 以了解有关wait()notify() 的更多信息。

**2. Thread.join()方法

*join方法在Thread* 类中定义:

public final void join() throws InterruptedException

等待该线程死亡。

当我们在线程上调用join()方法时,调用线程将进入等待状态。它将一直处于等待状态,直到引用的线程终止。

我们可以在下面的代码中看到这种行为:

classSampleThreadextendsThread {
publicint processingCount = 0;
    SampleThread(int processingCount) {
        this.processingCount = processingCount;
        LOGGER.info("Thread Created");
    }@Override
publicvoidrun() {
        LOGGER.info("Thread " + this.getName() + " started");
while (processingCount > 0) {
try {
                Thread.sleep(1000);
            }catch (InterruptedException e) {
                LOGGER.info("Thread " + this.getName() + " interrupted");
            }
            processingCount--;
            LOGGER.info("Inside Thread " + this.getName() + ", processingCount = " + processingCount);
        }
        LOGGER.info("Thread " + this.getName() + " exiting");
    }
}@Test
publicvoidgivenStartedThread_whenJoinCalled_waitsTillCompletion()
throws InterruptedException {
Thread t2 =newSampleThread(1);
    t2.start();
    LOGGER.info("Invoking join");
    t2.join();
    LOGGER.info("Returned from join");
    assertFalse(t2.isAlive());
}

执行代码时我们应该期待类似以下的结果:

[main] INFO: Thread Thread-1 Created
[main] INFO: Invoking join
[Thread-1] INFO: Thread Thread-1 started
[Thread-1] INFO: Inside Thread Thread-1, processingCount = 0
[Thread-1] INFO: Thread Thread-1 exiting
[main] INFO: Returned from join

如果引用的线程被中断,*join()*方法也可能返回。在这种情况下,该方法将抛出 InterruptedException

最后,*如果引用的线程已经终止或者尚未启动,则对*join()方法的调用将立即返回

Thread t1 =newSampleThread(0);
t1.join();  //returns immediately

3. Thread.join() 方法带有超时

如果引用的线程被阻塞或处理时间过长,  *join()方法将继续等待。这可能会成为一个问题,因为调用线程将变得无响应。为了处理这些情况,我们使用join()*方法的重载版本,允许我们指定超时期限。

*有两个定时版本可以重载*join()方法: