AたCountDownLatch(ダウンカウンタ)説明 - コンカレント

メソッド説明:
 
ます。public void COUNTDOWN()
     カウントに達するがゼロの場合、ラッチカウントは、すべての待機中のスレッドを解放し、デクリメントされます。現在のカウントがゼロより大きい場合、カウントは減少します。新しいカウントはスレッドのスケジューリングの目的のために、ゼロの場合は、すべての待機中のスレッドを再度有効にします。
     現在のカウントがゼロに等しい場合、何も起こりません。

パブリックブールのawait(長いタイムアウト、TimeUnitでの
単位は)InterruptedExceptionあるが、スロー     スレッドが中断、または指定された待機時間がされていない限り、ラッチ、ゼロまでカウントダウンされて前に、現在のスレッドを待機させます。現在のカウントがゼロの場合、このメソッドはすぐに真の値を返します。
     現在のカウントがゼロより大きい場合、スレッドのスケジューリングの目的のために、現在のスレッドが無効になっている、と3つのいずれかが起こる前に、スレッドの嘘はまで待機します:
         またはいくつかの他のスレッドが現在のスレッドに割り込み;または指定された待機時間を超えたコールのカウントダウン()メソッドので、ゼロに達するを数えます。
          カウントがゼロに達した場合*、その方法は、真の値を返します。
          *このメソッドへのエントリの現在のスレッドは、スレッドの割り込みステータスが設定されている場合、または待機している間に中断され、その後、InterruptedExceptionあるがスローされ、現在のスレッドの割り込みステータスがクリアされます。
          あなたが指定された待機時間を超えた場合は*、戻り値はfalseです。時間がゼロ未満である場合、このメソッドは待機しません。
    
     パラメータ:
         タイムアウトを - 待つ最大時間
         ユニット - timeout引数の時間単位。
     戻り値:
         カウントがゼロになった場合は、trueを返す;カウントに達するが、待機時間が経過する前にゼロの場合、falseが返されます
     例外:
          例外:InterruptedException - 現在のスレッドが中断された場合に待機している間に
 
例1:
      子スレッドの実行のためにメインスレッドを待ち、実行中に完成されています。
輸入java.util.concurrent.CountDownLatch;
輸入java.util.concurrent.ExecutorService;
輸入java.util.concurrent.Executors。
 
パブリック クラスCountdownLatchTest1 { 
 
        公共 静的 ボイドメイン(文字列[]引数){ 
              ExecutorServiceのサービス =エグゼキュータ。newFixedThreadPool(3 )。
               最終 =ラッチたCountDownLatch 新しいたCountDownLatch(3 )。
               以下のためにINT iは= 0; I <3; I ++ ){ 
                     Runnableを実行可能 = 新しいRunnableを(){
                           
                            @Override 
                            公共 無効RUN(){
                                    試み{ 
                                         システムout.printlnを(。 "子スレッド" +にThread.currentThread()のgetName() + "がスタートしました。" ); 
                                         。スレッドSLEEP((ロング)(数学ランダム()。 10000 * )); 
                                         。システムout.printlnを(。 "子スレッド" +にThread.currentThread()のgetName() + " 実行が完了している" ); 
                                         latch.countDown(); // 現在のスレッドがこのメソッドを呼び出し、1によるカウント 
                                  } キャッチ(InterruptedExceptionあるE){
                                         e.printStackTrace(); 
                                  } 
                           } 
                     }; 
                     
              } 
              
               試し{ 
                     out.printlnをシステム(。 "メインスレッド" +にThread.currentThread()のgetName()。 + " 待っ子スレッドの実行が完了している..." ); 
                     latch.await( ); // タイマー値までブロック現在のスレッドが0である 
                     システムout.printlnを( "メインスレッド" +にThread.currentThread()のgetName() + " 開始...."。); 
              } キャッチ(InterruptedExceptionあるE ){ 
                     e.printStackTrace(); 
              } 
         } }
例2:
     メーターレースは、選手が会場のパスワード審判に到達するのを待っている4人の選手は、審判がパスワードを聞いて、すべてのプレイヤーが最後に到達したときにプレイヤーが、同時に開始聞いた後、審判は要約ランキングを集計しました。
輸入java.util.concurrent.CountDownLatch;
輸入java.util.concurrent.ExecutorService;
輸入java.util.concurrent.Executors。
 
パブリック クラスCountdownLatchTest2 { 
 
        公共 静的 ボイドメイン(文字列[]引数){ 
              ExecutorServiceのサービス = エグゼキュータ。newCachedThreadPool();
               最終たCountDownLatch cdOrderは= 新しいたCountDownLatch(1 )。
               最終たCountDownLatch cdAnswerは= 新しいたCountDownLatch(4 )。
               以下のためにINT iは= 0; I <4; I ++ ){
                     RunnableをRunnableを = 新しい新しいRunnableを(){
                             公共 RUN(){
                                    試み{ 
                                         out.printlnをシステム(。 "プレイヤー" +にThread.currentThread()のgetName()。 "+ リリースパスワードREFを待っている" ); 
                                         cdOrder.await() ; 
                                         。システムout.printlnを( "プレーヤー" +にThread.currentThread()のgetName() + " 審判のパスワードを受け入れた。" ); 
                                         スレッドSLEEP((。ロング)(数学ランダム()* 10000 )); 
                                         。システムOUT 。println("プレーヤー" +にThread.currentThread()のgetName() + "は、端末に到達する。" ); 
                                         CdAnswer.countDown(); 
                                  } キャッチ(例外e){ 
                                         e.printStackTrace(); 
                                  } 
                           } 
                     }; 
                     service.execute(Runnableを)。
              } 
               試し{ 
                     スレッドSLEEP((。ロング)(数学ランダム()* 10000 )); 
 
                     。システムout.printlnを( "審判" +にThread.currentThread().getName() + " 今後のパスワード");
                     cdOrder.countDown(); 
                     。システムout.printlnを( "審判" +にThread.currentThread().getName() + " パスワードは、すべてのプレイヤーが最後に到達するのを待っている、送られてきた" ); 
                     cdAnswer.await(); 
                     。システムOUT。 println( "すべてのプレイヤーが最後に到達" 
                     。out.printlnをシステム( "REF" +にThread.currentThread().getName() + " 要約順位" ); 
              } キャッチ(例外e){ 
                     e.printStackTrace() ; 
              } 
              service.shutdown(); 
 
       } 
}

 

おすすめ

転載: www.cnblogs.com/wsy0202/p/12024701.html