我已经仔细阅读了 Oracle 文档,但找不到针对我的问题的设计模式解决方案。我有两个匿名线程,一个需要通知另一个。
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.a();
obj.b();
}
MyClass 有两个不同的函数,每个函数都启动一个匿名线程。B 人希望被他的妻子 A 叫醒。
public class MyClass{
public MyClass(){
}
public void a() {
new Thread(new Runnable(){
@Override
public synchronized void run() {
System.out.println("A: I am going to sleep");
try {
Thread.sleep(1000);
System.out.println("A: I slept one full day. Feels great.");
System.out.println("A: Hey B, wake up!");
notifyAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
public void b() {
new Thread(new Runnable(){
@Override
public synchronized void run() {
System.out.println("B: I am going to sleep. A, please wake me up.");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("B: Thank you A for waking me up!");
}
}).start();
}
}
不幸的是,B 永远睡着了,无法被他的妻子 A 叫醒。
程序的输出:
A: I am going to sleep
B: I am going to sleep. A, please wake me up.
A: I slept one full day. Feels great.
A: Hey B, wake up!
我知道 A 和 B 在两个不同的匿名线程对象中运行,所以 A 只能通知另一个 A(床上没有其他妻子,所以通知功能在这里没用)。
这个问题的正确设计模式是什么?