2016-06-23 2 views
0

ThreadBがnotify()を実行していない場合、ThreadAは実行待ち状態になるはずです。 別のスレッドが実行を完了すると、スレッドが待機状態から出る可能性があります。マルチスレッドでnotify()を使わずに待機状態からスレッドを出す

public class ThreadA extends Thread 
{ 
    public static void main(String[] args) 
    { 
     ThreadB B = new ThreadB(); 
     B.start(); 
     synchronized (B) { 
      try { 
       /* Go into waiting state */ 
       B.wait(); 
      } catch (InterruptedException e) { 
      } 

      System.out.println(B.result); 
     } 
    } 
} 

class ThreadB extends Thread 
{ 
    int result; 

    public void run() 
    { 
     synchronized (this) { 
      for (int i = 0; i <= 10; i++) { 
       result = result + i; 
      } 
      // notify(); 
     } 
    } 
} 

出力:

55
+1

'B.wait()'とは何と思いますか?どうしてそう思うの? –

+0

スレッドは、対象オブジェクトのwait()メソッドを実行することによってこの待機リストに入ります。その時点から、ターゲットオブジェクトのnotify()メソッドが呼び出されるまで、それ以降の命令は実行されません。 –

+0

あなたの例ではどのスレッドがブロックされますか?実際に 'B.wait()'と呼ばれるメインスレッド、または 'B'で参照される' Thread'オブジェクトによって表されるスレッドはありますか? –

答えて

1

あなたはのJavaDoc(http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join())に移動し、あなたはそれがスレッドに、待機を使用し通知し、またはのnotifyAllする決して言わないことがわかりますスレッドのドキュメントを読んでいる場合。内部的には、Thread.join()とスレッドの死を使用してwaitおよびnotifyAllを使用して結合機能を実現します。

1

スレッドが終了する/存在する場合は、そのインスタンスでnotifyAllになります。これはあなたが見ているものです。

関連する問題