ブリーフ
たCountDownLatchは、スレッドに達した複数(たCountDownLatchは、場合数カウントパラメータの特定の値に等しいが初期化される)主機構たCountDownLatchことを条件とする、クラスjava.util.concurrentパッケージである制御同時実行に使用される一般的なツールであります状態は、作業を完了するために期待されるイベントをトリガすることが期待されている場合、このイベントはそのフォローアップをトリガするためか、他のスレッドが待っているかもしれません。状態は、独自のスレッドに達すると予想されて待機しているスレッドの呼び出しがされたCountDownLatchのメソッドを待っている間、カウントダウン方式たCountDownLatchを呼び出します。
あなたはNポイントの完了を待つしたい場合たCountDownLatchコンストラクタは、着信N.ここでは、int型のカウンタのパラメータとして受け取り、
ワーカープロセスが比較的遅い場合、私たちは永遠に待つメインスレッドを任せることはできません。指定した時間----のawait(長い時間、TimeTnit単位)を持つ別のメソッドのawaitを使用することが可能であり、現在のスレッドをブロックしない、時間を待った後に、この方法を開発しました。
注:カウンタは、カウンタが0に等しい場合、のawaitメソッドを呼び出すと、現在のスレッドをブロックしない、0以上でなければなりません。
二、たCountDownLatchは、例を使用しています
インポートjava.util.concurrent.CountDownLatch; パブリック クラスCountDownLatchDemo { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ AたCountDownLatch LATCH = 新しい新たCountDownLatch(2); // 2つのスレッドが動作する 新しい新しいワーカー( "WORK1"を、200であり、 LATCH).start(); 新しい新しい労働者( "WORK2"、300 、LATCH).start(); latch.await(); // すべてのスレッドが終了するのを待つ のSystem.out.printlnを( "作業完了" ); } 静的 クラスワーカーは延びスレッド{ WorkNameストリング; INT WorkTime; たCountDownLatch LATCH、 公共労働者(文字列workName、INT は、WorkTime、たCountDownLatch LATCH){ この .workName = workName; この .workTime = WorkTime; この .latch = LATCH; } 公共 ボイドRUN(){ のSystem.out .println(workName + "ジョブを開始" ); doWork(); System.out.printlnは(workName + "エンド・ジョブ" ); latch.countDown(); // 作業が行われ、カウンタがデクリメントされ } プライベート ボイドdoWork(){ 試み{ のThread.sleep(workTime)。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } }
第三に、参加するために比較
同じ子に比べて参加を完了するためのスレッドのスレッドを待機させることができ、より柔軟な制御により提供されたCountDownLatchカウンタ、コールのカウントダウン方法、Nはなりマイナス1、たCountDownLatchのawaitメソッドブロック、現在のスレッド、Nが0となり知ってますカウントダウン方法はNポイントがN個のスレッドすることができ言いので、ここで、使用済みの任意の場所にすることができますので、それはまた、N個の実行ステップすることができます。
参加するには、現在のスレッドの待ち時間がスレッドの実行が終了に参加するために使用されます。実装原理は常に生きているスレッドに参加、その後、現在のスレッドは永遠に待つことを許可すれば、スレッドは、生きているJOINをチェックしています。
例としては、次のとおりです:
インポートjava.util.concurrent.CountDownLatch; パブリック クラスCountDownLatchDemo { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ AたCountDownLatch LATCH = 新しい新たCountDownLatch(2); // 2つのスレッドが動作する 新しい新しいワーカー( "WORK1"を、200であり、 LATCH).start(); 新しい新しい労働者( "WORK2"、300 、LATCH).start(); latch.await(); // すべてのスレッドが終了するのを待つ のSystem.out.printlnを( "作業完了" ); } 静的 クラスワーカーは延びスレッド{ WorkNameストリング; INT WorkTime; たCountDownLatch LATCH、 公共労働者(文字列workName、INT は、WorkTime、たCountDownLatch LATCH){ この .workName = workName; この .workTime = WorkTime; この .latch = LATCH; } 公共 ボイドRUN(){ のSystem.out .println(workName + "ジョブを開始" ); doWork(); System.out.printlnは(workName + "エンド・ジョブ" ); latch.countDown(); // 作業が行われ、カウンタがデクリメントされ System.out.println(workName + "第二段階を開始する" ); doWork(); のSystem.out.println(workName + "第二相の終わり" ); } プライベート ボイドdoWork(){ 試み{ のThread.sleep (WorkTime); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } } }
次のように印刷結果は以下のとおりです。
WORK1作業を開始する
作業を開始WORK2
作業のWORK1側を
第二段階の開始WORK1
作業のWORK2の終了
作業が完了した
第二段階の開始WORK2
の第二段階のWORK1の終了
作業の第二段階のWORK2の終わり