当我们在线程中使用join方法时,当前正在运行的线程被停止,另一个线程开始工作,第一个线程将在第二个线程完成其工作后再次开始运行。怎么做到这一点?第二个线程如何将对象锁定传递给第一个线程?
答案 0 :(得分:2)
查看实现
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0); // timeout of 0 means forever
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
因此,当前的Thread
只会在另一个wait()
上调用Thread
,而另一个Thread
尚未完成,即。 isAlive()
仍然会返回true
。
请注意,该方法为synchronized
,否则我不确定您的意思
第二个线程如何将对象锁定传递给第一个线程?
但是,当您拨打wait()
时,您会释放对象监视器,因此第三个Thread
也可以join()
Thread
。
zch的其他详细信息:
join()
方法等待此线程最多毫秒 去死。超时为0意味着永远等待。此实现使用 以this.wait
为条件的this.isAlive
次调用循环。作为一个线程 终止调用this.notifyAll
方法。建议 应用程序不在线程上使用wait,notify或notifyAll 实例。没有系统支持就无法做到这一点(除了 忙着等待。