为什么wait()方法没有触发notifyAll()?

Why does the wait() method not trigger notifyAll()?

我是 Java 多线程的新手,编写了一个小程序来测试 wait() 和 notifyAll() 方法如何相互交互。但是为什么这个程序不起作用?

package sample;
    
    public class Main {
    
        public static void main(String[] args) {
            new Thread(new MyWriter()).start();
            new Thread(new MyReader()).start();
        }
    }
    
    class MyReader implements Runnable {
    
        @Override
        public synchronized void run() {
            while(true) {
                notifyAll();
            }
        }
    }
    
    class MyWriter implements Runnable {
    
        @Override
        public synchronized void run() {
            while(true) {
                try {
           

     System.out.println("Waiting...");
                wait();
                System.out.println("Wait Terminated");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

当运行时,我预计输出是

Waiting...
Wait Terminated

但它输出

Waiting...

然后一直等到我手动终止它。

A notify 调用通知在对象监视器上等待的对象。所以,如果你在一个对象上发出 wait,你必须 notify 使用同一个对象。

一种方法是简单地使用共享对象:

public static void main(String[] args) {
     Object lock=new Object();
     new Thread(new MyWriter(lock)).start();
     new Thread(new MyReader(lock)).start();
}

然后:

public void run() {
 while(true) {
    synchronized(lock) {
        lock.notifyAll();
    }
 }

public void run() {
   while(true) {
      try {
         synchronized(lock) {        
             System.out.println("Waiting...");
             lock.wait();
             System.out.println("Wait Terminated");
         }
      } ...
}