Oracle のドキュメントを注意深く読みましたが、問題の設計パターンの解決策が見つかりませんでした。2 つの匿名スレッドがあり、一方が他方に通知する必要があります。
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.a();
obj.b();
}
MyClass には 2 つの異なる関数があり、それぞれが匿名スレッドを起動します。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 は 2 つの異なる匿名スレッド オブジェクトで実行されているため、A は他の A にのみ通知できることを理解しています (ベッドには他の妻がいないため、ここでは通知機能は役に立ちません)。
この問題の正しい設計パターンは何ですか?