スレッドを拡張して待機/通知する2つのクラスがあります
class A extends Thread {
int r = 20;
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
notify();
}
}
}
class B extends Thread {
A a;
public B(A a) {
this.a = a;
}
public void run() {
synchronized (a) {
System.out.println("Starting...");
try {
a.wait();
} catch (InterruptedException e) {
}
System.out.println("Result is: " + a.r);
}
}
}
クラスAは実行終了時にクラスBに通知する
A a = new A();
new B(a).start();
new B(a).start();
new B(a).start();
そして次のコード
a.start();
すべてのスレッドに通知します。
new Thread(a).start();
1つのスレッドに通知する
なぜa.start()はすべてのスレッドに通知するのですか?
回答:
回答№1の場合は7そうではありません
a.start();
すべてのスレッドに通知します。実際には、 a
終了すると、モニター上で待機しているすべてのスレッドに通知されます。
これは、 javadoc
スレッドが終了すると、
this.notifyAll
メソッドが呼び出されます。 アプリケーションは使用しないことをお勧めしますwait
,notify
、またはnotifyAll
にThread
インスタンス。
一方、
new Thread(a).start();
あなたが使っている a
として Runnable
、としてではなく Thread
。呼び出される実際のスレッド this.notifyAll
インスタンス作成式で作成されたものです new Thread(a)
他のスレッドは呼び出されていません Object#wait()
に。