微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

执行wait之后,如果没有从其他线程得到通知,一个线程要等待多长时间?

如何解决执行wait之后,如果没有从其他线程得到通知,一个线程要等待多长时间?

在下面的示例中,由于未从子线程获得主线程的通知,因此应永远等待。但是主线程正在执行,下面示例的输出是:

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实例上使用notifynotifyAllThread

回答问题

签出Object#wait(或JLS (17.2.1. Wait)):

线程可以被唤醒,而不会被通知,中断或超时,即所谓的虚假唤醒。尽管实际上这种情况很少发生,但应用程序必须通过测试应该导致线程唤醒的条件来防范它,并在条件不满足时继续等待。

因此Java中的线程可以随时唤醒。 A spurious wakeup is not very likely,但有可能发生。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。