Java等待通知 - 通知通知所有线程

时间:2014-12-16 14:59:40

标签: java multithreading

我有两个扩展Thread的类和一个wait / notify

class A extends Thread {

    int r = 20;

    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (this) {
            notify();
        }
    }
}

class B extends Thread {

    A a;

    public B(A a) {
        this.a = a;
    }

    public void run() {
        synchronized (a) {
            System.out.println("Starting...");
            try {
                a.wait();
            } catch (InterruptedException e) {
            }
            System.out.println("Result is: " + a.r);
        }
    }
}

A类在执行结束时通知B类

A a = new A();
new B(a).start();
new B(a).start();
new B(a).start();

以下代码

a.start();

通知所有主题

new Thread(a).start(); 

通知一个帖子

为什么a.start()会通知所有线程?

1 个答案:

答案 0 :(得分:8)

不是

a.start();

通知所有线程。事实是a引用的线程终止通知在其监视器上等待的所有线程。

javadoc

中对此进行了解释
  

当线程终止时,将调用this.notifyAll方法。 建议应用程序不要在wait个实例上使用notifynotifyAllThread

另一方面,在

new Thread(a).start(); 

您将a用作Runnable,而不是Thread。将调用this.notifyAll的实际线程是由实例创建表达式new Thread(a)创建的线程,没有其他线程调用Object#wait()