2011-01-19 1 views
0

Pausing a Threadの例を参照してください。通知の代わりにnotifyAllを使用した場合、副作用があり、必要ですか?notifyAllを使用してスレッドを再開する

+0

私は脱退していることは知っていますが、並行性ユーティリティを使用して待機して通知する方が優れています。 –

+0

@ doc_180を実行してから、並行性ユーティリティを使用してスレッドを一時停止および再開するための一般的な方法を示してください。 –

+0

あなたはDoug Leaの本の同時性に関する読書より悪いことになります。とにかくここでは簡単なエグゼキュータとラッチのサンプルがあります。下の別の答えのコードサンプル。 –

答えて

6

この例では、待機中のスレッドが1つしかないため、違いはありません。

notifynotifyAllの違いは、1人ではなくすべてのウェイターが復帰することです。

+1

もう1つ注目すべきは、notify()では、どのスレッドが起きたかを制御できないということです。これは選択された任意のスレッドです。ですから、優先度を偏向させる必要がある場合は、java.util.concurrentのより高度な実装を探す必要があります。 – berry120

0

複数の当事者がオブジェクトを待つことができる場合は、通知ではなくnotifyAllを使用することが重要です。 1つのスレッドだけが待っていれば、notifyとnotifyAllを呼び出す間に違いはありません。 「効果的なJavaの」項目69に

1

、ブロッホは「はいつものnotifyAllを使用する」を示唆しています。

-1

新しい実行可能ファイルを作成します。 runメソッド "start"では、countdownlatchが待機しており、あらかじめ定義された時間、そのラッチのcountdownを呼び出して解放されない限り、実行は許可されません。この場合1.(開始は同時のnoとして1を渡すので)

//改訂された回答。 //実行可能クラス。

public class WorkerThread implements Runnable 
    { 
     CountDownLatch start; 

     CountDownLatch end; 

     String name; 

     WorkerThread(CountDownLatch startLatch, CountDownLatch stopLatch) 
     { 
      this.start = startLatch; 
      this.end = stopLatch; 

     } 

     public void run() 
     { 
      try 
      { 

       start.await(); 
      } catch (InterruptedException ex) 
      { 
       ex.printStackTrace(); 
      } 
      System.out.println("Will run when start is released "); 
      end.countDown(); 
     } 
    } 

//ワーカースレッドを実行するエントリポイントメソッドです。

public void initiateProcess (final int count) { 
      CountDownLatch start = new CountDownLatch(1); 
     CountDownLatch stop = new CountDownLatch(count); 
     for (int i = 0; i < count; i++) 
     { 
      new Thread(new WorkerThread(start, stop)) 
        .start(); 
     } 
     System.out.println("Go"); 
// This is where start latch is released. Now worked thread can complete its function. 
     start.countDown(); 
     try 
     { 


// Stop will wait until stop latch is countdowned to zero from count param. (see count param) 
      stop.await(); 
     } catch (InterruptedException ex) 
     { 
      ex.printStackTrace(); 
     } 
     System.out.println("Finished"); 
    } 
+0

スレッドを一時停止および再開する方法は正確には表示されません。 –

+0

うーん...あなたはおそらく正しいです、私は急いで小さなラッチサンプルを投稿していました。私は答えを改訂しました。 –

+0

このクラスをコピーし、デバッガモードで実行してください。カウントダウンをよく理解するのに役立ちます。 –

関連する問題