/ / Java待機通知 - 通知はすべてのスレッドに通知します - java、マルチスレッド

Java待機通知 - 通知はすべてのスレッドに通知します - java、マルチスレッド

スレッドを拡張して待機/通知する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、または notifyAllThread インスタンス。

一方、

new Thread(a).start();

あなたが使っている a として Runnable、としてではなく Thread。呼び出される実際のスレッド this.notifyAll インスタンス作成式で作成されたものです new Thread(a)他のスレッドは呼び出されていません Object#wait() に。