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 之前添加一个短暂的延迟。
我一直在尝试制作一个简单的 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 之前添加一个短暂的延迟。