サンプルを使用してコード
たCountDownLatchの実現により:「メインスレッド」「5つのサブスレッドを」待って、すべての「指定された作業(睡眠1000ミリ秒)」の後に行われ、その後、実行し続けています。
輸入java.util.concurrent.CountDownLatch。 パブリック クラスCountDownLatchTest { プライベート 静的たCountDownLatchラッチ= 新たCountDownLatch(5 ); パブリック 静的 ボイドメイン(文字列[]引数){ System.out.println( "メインスレッドが開始...." ); System.out.println(); 以下のために(int型、iは5 <; I = 0 iは++ ){ 新しいInnerThreadは())(開始。 } してみてください{ latch.await(); System.out.println(); System.out.println( "メインスレッドlatch.getCount =" + latch.getCount()); } キャッチ(InterruptedExceptionある電子){ System.out.println( "例外がラッチのawaitで起こった:" + e)前記 } System.out.println( "メインスレッドの終わり...." ); } 静的 クラス InnerThreadは拡張スレッド{ 公共 のボイドの実行(){ 同期(InnerThread。クラス){ しようと{ Thread.sleep( 1000年); System.out.println(にThread.currentThread()のgetName() + "SLEEP 1000年MS。" ); // 値マイナスたCountDownLatch 1。 latch.countDown(); System.out.println(にThread.currentThread()のgetName()。 + "カウント数:" + latch.getCount()); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } } }
結果:ラッチが0になるまで待つメインスレッドは、メインスレッドがカウントダウンによって継続される必要があります。
メインスレッド開始....
スレッド-1睡眠千ミリ秒。
スレッド1カウント数:4
スレッド4睡眠千ミリ秒。
スレッド4カウント数:3
スレッド0スリープ千ミリ秒。
スレッド0カウント数:2
スレッド3睡眠千ミリ秒。
スレッド3カウント数:1
スレッド2睡眠千ミリ秒。
スレッド2カウント数:0
メインスレッドlatch.getCount = 0
メインスレッド終了....
第二に、解釈の従来の方法
// 構築与えられたカウントがされたCountDownLatchで初期化されます。 たCountDownLatch(int型COUNT) // 現在のスレッドは、ラッチにカウントダウンスレッドが中断されない限り、ゼロになるまで待たなければなりません。 無効のawaitを() // 現在のスレッドを待機スレッドが中断されていない限り、ラッチ前にゼロまでカウントダウン、または指定された待機時間。 ブールのawaitを(ロングタイムアウト、TimeUnitでユニット) // カウントがすべての待機中のスレッドを解放し、ゼロに達した場合、ラッチのカウントをデクリメントします。 空COUNTDOWN() // 現在のカウントを返します。 ロング同様にgetCount() // その状態として、このラッチを識別する文字列を返します。 文字列のtoString()
第三に、ソースコードの解釈
AQSから継承同期オブジェクトを通じて達成するために達成されたCountDownLatchの内側に見ることができます。
コンストラクタ:
クラス定義の同期に関連しているのカウントダウンのように