当我们在线程中使用 join 方法时,当前运行的线程会停止,并且另一个线程开始工作,条件是第一个线程将在第二个线程完成其工作后再次开始运行。如何做到这一点?第二个线程如何将对象锁传递给第一个线程?
问问题
91 次
1 回答
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()
在 this 上Thread
。
zch的其他详细信息:
该
join()
方法最多等待几毫秒让该线程终止。超时 0 意味着永远等待。此实现使用以 为this.wait
条件的调用循环this.isAlive
。当一个线程终止时,该this.notifyAll
方法被调用。建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。这在没有系统支持的情况下无法完成(忙碌等待除外)。
于 2013-09-22T13:39:26.277 回答