4 回答
TA贡献1818条经验 获得超11个赞
如果您查看源代码,Thread::join您会注意到它调用了Thread::join(timeout)方法。查看此方法的源代码,我们可以看到它通过调用循环检查线程的状态Thread::isAlive:
...
if (millis == 0 L) {
while (this.isAlive()) {
this.wait(0 L);
}
} else {
while (this.isAlive()) {
long delay = millis - now;
if (delay <= 0 L) {
break;
}
this.wait(delay);
now = System.currentTimeMillis() - base;
}
}
...
因此,如果您调用的线程join终止 -join将返回并且不执行任何操作。
TA贡献1877条经验 获得超6个赞
我尝试总结一下,同时添加解释。
的要点thread.join()
是等待线程终止。这就是它在join 文档中告诉您的内容:
等待这个线程结束。
等待已终止的线程终止非常简单(!),并且似乎没有合乎逻辑的理由将等待已终止的线程终止视为错误。您想知道线程何时结束。它有。
更重要的是,如果调用者必须确保线程在等待它终止之前没有终止,这将创建一个每个调用者都必须补偿的计时窗口。琐碎的序列
Thread t = new Thread(…); t.start(); t.join();
由于其固有的种族危险,很容易失败。换句话说,那将是一种糟糕的设计方式join
。
添加回答
举报