スレッドには複数の状態があります。実行中の実行可能な実行中の待機中であり、終了しました。 notifyAll()メソッドは、オブジェクトのロック上に「待機中」のすべてのスレッドを「実行可能」状態に戻し、次の実行オブジェクトとして選択することが想定されています。 次の例では、 'calc'オブジェクトのロックが解除されるまで待機(wait()メソッド)する3つのReaderスレッドをインスタンス化して開始します。 calcオブジェクトスレッドはインスタンス化され、この後すぐにいくつかの数値を加算し、その後にnotifyAll()を追加します。スレッドnotifyAll()
私の質問は、calcスレッドが毎回すべてのリーダースレッドに通知するのはなぜですか?私はこれを私のコンピュータ上で実行すると、ヒットしてミスします。複数のスレッドを実行する際、スレッドの実行順序をが保証されない
public class Reader extends Thread{
Calculator c;
public Reader(Calculator calc){
c=calc;
}
public void run(){
synchronized(c){
try{
System.out.println("Waiting for calculation...");
c.wait();
}catch(InterruptedException e){}
System.out.println("Total is: "+c.total);
}
}
public static void main(String[] args){
Calculator calc = new Calculator();
new Reader(calc).start();
new Reader(calc).start();
new Reader(calc).start();
new Thread(calc).start();
}
}
class Calculator implements Runnable{
int total;
public void run(){
synchronized(this){
for(int i =0; i<100; i++){
total+=i;
}
notifyAll();
}
}
}
'notifyAll()'はすぐにスレッドをRUNNABLEにしません。効果的に状態をWAITINGからBLOCKEDに変更します。スレッドAがオブジェクト 'o'のロックを獲得するまでは、スレッドAの' o.wait() 'コールは返ることができませんが、スレッドBがスレッド' o.notifyAll() 'を呼び出す時点でそれを行うことはできませんその呼び出しを行うには、Bがロックを保持している必要があります。 –