Java 线程从未收到通知

Java Thread never receiving notify

我一直在尝试制作一个简单的 Java 线程应用程序,其中一个线程等待,另一个线程在 3 秒后将其唤醒。但是,我似乎无法让它工作,而且我也不知道为什么。

public class Deadlock extends Thread {

Object lock = new Object();

public static void main(String[] args) {

    //WAITER THREAD
    Deadlock waiter = new Deadlock() {

        @Override
        public void run() {
            System.out.println("Waiter started");
            synchronized(lock) {
                try{
                    System.out.println("Waiter will wait for notify...");
                    lock.wait();
                    System.out.println("Woke up!");
                } catch(InterruptedException e) { 
                    e.printStackTrace();
                }
            }
        }//run()

    };

    //WAKER THREAD
    Deadlock waker = new Deadlock() {

        @Override
        public void run() {
            System.out.println("Waker started");
            synchronized(lock) {
                System.out.println("Waker sleeping for 3 seconds.");
                try{
                    Thread.sleep(3000);
                }catch(InterruptedException e) {}
                System.out.println("Waker notifying...");
                lock.notifyAll();
            }
        }//run

    };

    waiter.start();
    waker.start();
}

}

我得到的输出是:

服务员开始
服务员将等待通知...
威克开始
唤醒者睡眠 3 秒。
Waker 通知...

...并永远保持 运行。我希望等待线程唤醒并且程序终止。

谢谢

您的主要问题是 'lock' 是一个 class 实例 属性,因此两个死锁实例不共享相同的 'lock'。因此,在 waker 中调用 notifyAll() 对 waiter 没有影响,因为它正在等待不同的对象。最简单的解决方案是使 'lock' 静态:

static Object lock = new Object();

...我也会将其设为私有和最终版本以备不时之需。

第二个问题是,通过同时启动两个线程,您并不能真正保证服务员会先 运行 - 我会在启动 waker 之前添加一个短暂的延迟。