为什么在Java的Thread.join()中为循环调用wait()? //jdk7-Thread.java 公共最终同步的无效联接(长毫秒) 抛出中断异常{ 长基=System.currentTimeMillis(); long now=0; 如果(毫秒wait()(至少在第一个循环中)可以消除。第二个循环的逻辑必须稍微改变,但是对wait(delay)的调用也可以在那里消除

为什么在Java的Thread.join()中为循环调用wait()? //jdk7-Thread.java 公共最终同步的无效联接(长毫秒) 抛出中断异常{ 长基=System.currentTimeMillis(); long now=0; 如果(毫秒wait()(至少在第一个循环中)可以消除。第二个循环的逻辑必须稍微改变,但是对wait(delay)的调用也可以在那里消除,java,multithreading,Java,Multithreading,t.join()在线程终止之前不能返回。但仅仅因为wait()调用返回,这并不意味着线程终止。该方法一直循环,直到isAlive()返回false 注意:wait()可以在线程仍处于活动状态时返回的原因之一是,thread类的设计中没有任何内容阻止调用方等待,并通知线程实例用于其他目的 还有其他原因。请阅读,以获取有关如何使用wait()和notify()的详细说明,其中包括在循环中始终wait()的几个原因。t.join()在线程终止之前不得返回。但这仅仅是因为wait()调用返回,这并不意味

t.join()
在线程终止之前不能返回。但仅仅因为
wait()
调用返回,这并不意味着线程终止。该方法一直循环,直到
isAlive()
返回
false

注意:
wait()
可以在线程仍处于活动状态时返回的原因之一是,
thread
类的设计中没有任何内容阻止调用方等待,并通知
线程
实例用于其他目的

还有其他原因。请阅读,以获取有关如何使用
wait()
notify()
的详细说明,其中包括在循环中始终
wait()
的几个原因。

t.join()
在线程终止之前不得返回。但这仅仅是因为
wait()
调用返回,这并不意味着线程被终止。该方法一直循环,直到
isAlive()
返回
false

注意:
wait()
可以在线程仍处于活动状态时返回的原因之一是,
thread
类的设计中没有任何内容阻止调用方等待,并通知
线程
实例用于其他目的


还有其他原因。请阅读,以获取有关如何使用
wait()
notify()
的详细说明,包括在循环中始终
wait()
的几个原因。

wait()
的调用(至少在第一个循环中)是正确的第二个循环的逻辑必须改变一点,但是对
wait(delay)
的调用也可以在那里取消


但是,取消对
等待的调用将使循环从一种高效、低影响的等待事件发生的方式变为一种低效的等待方式,这将浪费CPU时间和精力。繁忙等待通常被认为是等待条件变为现实的最后手段。

的调用是正确的ode>wait()
(至少在第一个循环中)可以消除。第二个循环的逻辑必须稍微改变,但是对
wait(delay)
的调用也可以在那里消除


但是,取消对
wait
的调用将使循环从一种高效、低影响的等待事件发生的方式转变为一种低效的、浪费CPU时间和精力的方式。繁忙等待通常被认为是等待条件变为现实的最后手段。

等待(长)文档:"线程也可以在不被通知、中断或超时的情况下被唤醒,即所谓的虚假唤醒。虽然这在实践中很少发生,但应用程序必须通过测试本应导致线程被唤醒的条件来防止它,如果条件不满足,则继续等待。换句话说,等待应该d始终出现在循环中“此外,任何人都可以在线程上调用notify,并使其从
wait
中唤醒……不限于
wait(long)
的线程结束文档:线程也可以在不被通知、中断或超时的情况下被唤醒,即所谓的虚假唤醒。虽然这在实践中很少发生,但应用程序必须通过测试本应导致线程被唤醒的条件来防止它,如果条件不满足,则继续等待。换句话说,等待应该d总是出现在循环中“而且,任何人都可以在线程上调用notify,让它从
等待中醒来,
…不限于线程结束我知道join()返回(调用一次)或hava not return(调用循环),但是返回和不返回有什么区别?@B_qxzb,我不理解你的问题。我知道join()返回(调用一次)或者不返回(调用循环),但是返回和不返回之间有什么区别?@B_qxzb,我不理解你的问题。不,它不能被消除-
等待可以(很少)无故退出,最重要的是,
通知()
可以在线程上被任何人调用(有引用){我们应该喝一杯啤酒[:-)}@CarlosHeuberger-为什么退出
wait()
并不重要。另一个线程可以调用
notify()
,也不重要。循环所做的唯一一件事就是反复检查
isAlive()
返回
true
。一旦返回
false
,循环将退出。如果消除
wait()
,同样的情况也会发生-
isAlive()时循环将退出
返回
false
。唯一改变的是循环不必要地增加了检查的频率,而不是等待通知可能是检查的好时机。另外,我想喝杯啤酒!:)ups,当然,对不起,我错过了可以消除循环的解释…@CarlosHeuberger-啊。是的,消除了循环我会把事情搞得一团糟!不,它不能被消除,
wait
可以(很少)无缘无故地退出,最重要的是,
notify()
可以被任何人在线程上调用(引用它){我们应该喝一杯啤酒[:-)}@CarlosHeuberger-为什么
wait()
退出。另一个线程是否可以调用
notify()
,这并不重要。循环所做的唯一事情就是重复
//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;
        }
    }
}