https://www.baeldung.com/java-thread-join
在本教程中,我们将讨论Thread类中的 不同*join()*方法。我们将详细介绍这些方法和一些示例代码。
与wait()和notify()方法类似 ,*join()*是另一种线程间同步机制。
您可以快速浏览本教程 以了解有关wait()和notify() 的更多信息。
*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
如果引用的线程被阻塞或处理时间过长, *join()方法将继续等待。这可能会成为一个问题,因为调用线程将变得无响应。为了处理这些情况,我们使用join()*方法的重载版本,允许我们指定超时期限。
*有两个定时版本可以重载*join()方法: