メソッド説明:
ます。public void COUNTDOWN()
カウントに達するがゼロの場合、ラッチカウントは、すべての待機中のスレッドを解放し、デクリメントされます。現在のカウントがゼロより大きい場合、カウントは減少します。新しいカウントはスレッドのスケジューリングの目的のために、ゼロの場合は、すべての待機中のスレッドを再度有効にします。
現在のカウントがゼロに等しい場合、何も起こりません。
パブリックブールのawait(長いタイムアウト、TimeUnitでの
単位は)InterruptedExceptionあるが、スロー スレッドが中断、または指定された待機時間がされていない限り、ラッチ、ゼロまでカウントダウンされて前に、現在のスレッドを待機させます。現在のカウントがゼロの場合、このメソッドはすぐに真の値を返します。
パブリックブールの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(); } }