为什么在Java的Thread.join()中调用wait()进行循环?

时间:2018-11-02 14:38:22

标签: java multithreading

//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()进行循环?

2 个答案:

答案 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时间和精力。忙等待通常被认为是等待条件变为真的最后手段。