执行wait()后,如果一个线程没有得到其他线程的通知,它会等待多长时间?

2023-11-27

在下面的示例中,由于主线程没有收到子线程的通知,因此它应该永远等待。但是主线程正在执行,下面示例的输出是:

c
l
total: 19900

为什么主线程会被执行?

public class ThreadX extends Thread {
    static int total = 0;

    public void run() {
        synchronized (this) {
            for (int i = 0; i < 200; i++) {
                total = total + i;
            }
            System.out.println("c");

        }
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadX t = new ThreadX();

        t.start();
        synchronized (t) {
            t.wait();
            System.out.println("l");
        }

        System.out.println("total: " + total);

    }
}

回答问题主体

查看Thread#join(long):

[...]当线程终止时this.notifyAll方法被调用。 [...]

请注意Thread#join()调用该函数0,这意味着永远。

[...] 超时为 0 意味着永远等待。

所以在你这里的情况t只是打电话notifyAll当它终止时,通知正在等待的主线程t.


这种不直观的行为是他们在文档中编写以下内容的原因:

建议应用程序不要使用wait, notify, or notifyAll on Thread实例。

回答问题标题

查看Object#wait (or JLS(17.2.1.等待)):

线程可以在没有被通知、中断或超时的情况下唤醒,即所谓的虚假唤醒。虽然这种情况在实践中很少发生,但应用程序必须通过测试应导致线程被唤醒的条件来防止这种情况,并在条件不满足时继续等待。

所以Java中的线程可以随时被唤醒。虚假唤醒的可能性不大但这有可能发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

执行wait()后,如果一个线程没有得到其他线程的通知,它会等待多长时间? 的相关文章

随机推荐