//jdk7-Thread.java
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); //why is wait() called for loop in Thread.join() of Java?
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
因为调用一次可以让主线程等待,调用loop也可以让主线程等待,所以为什么要调用wait()进行循环?
答案 0 :(得分:2)
t.join()
不得在线程终止之前返回。但是仅仅因为wait()
调用返回,并不意味着该线程被终止。该方法一直循环直到isAlive()
返回false
。
注意: 之所以wait()
可以在线程仍处于活动状态时返回的原因是,Thread
类的设计中没有什么阻止调用者等待,并且通知Thread
实例用于其他目的。
还有其他原因。阅读Guarded Blocks Tutorial以获得有关如何使用wait()
和notify()
的详尽说明,包括为什么您总是wait()
循环使用的几个原因。
答案 1 :(得分:2)
您是正确的,可以消除对wait()
的调用(至少在第一个循环中)。第二个循环的逻辑必须稍作更改,但是在那里也可以消除对wait(delay)
的调用。
但是,消除对wait
的调用将使循环从一种高效的,低影响的等待事件发生的方式转变为一种低效的busy wait,这会浪费CPU时间和精力。忙等待通常被认为是等待条件变为真的最后手段。