ロックはドアに相当します。ロックが終了状態に達する前は、ドアは常に閉じられており、スレッドは通過できません。終了状態に達すると、ドアが開き、すべてのスレッドが通過できるようになります。一連のイベントが発生するまで 1 つ以上のスレッドを待機させることができます。ラッチ状態は、待機するイベントの数を示す正式な正の数に初期化されるカウンターで構成されます。 countDown メソッドはカウンターをデクリメントしてイベントが発生したことを示しますが、await メソッドはカウンターが 0 に達するまで待機し、待機していたイベントが発生したことを示します。 CountDownLatch は、1 つのスレッド (または複数のスレッド) が実行を続ける前に、他の n 個のスレッドが何かを完了するのを待つ必要があることを強調します。
シナリオの適用:
10 人の選手が走る準備をし、審判の指示を待って一斉に走り始め、最後の選手がゴールラインを通過するとゲームは終了します。 10 個の動きは 10 個のスレッドに相当します。ここで重要なのは、同時に実行する 10 個のスレッドを制御することと、最後のスレッドが終了点に到達したことをどのように判断するかです。 2 つのロックを使用できます。最初のロックは審判の命令を待つ 10 個のスレッドを制御するために使用され、2 番目のロックはゲームの終了を制御します。
import java.util.concurrent.CountDownLatch; クラス Aworker は、Runnable を実装します。 = begin; this.end = end; } @Override public void run() { // TODO 自動生成されたメソッド スタブ try { System.out.println(num + "th people is Ready"); //Ready} catch (InterruptedException e) { e.printStackTrace() } //カウンターは 1 つ減り、終点に到達します。 CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, begin, end)).start() ; } try { Thread.sleep((long) (Math.random() * 5000)) } catch (InterruptedException e1) { // TODO自動生成されたキャッチ ブロック e1.printStackTrace(); } System.out.println("judge Say: run!"); //審判が指示を出してから走り始める startTime = System.nanoTime( ); try { end.await(); //終了を待ちます} catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); System.nanoTime(); System.out.println("裁判官は全員到着しました!"); System.out.println("滞在時間: " + (endTime - startTime));
出力
1 人目は準備完了 2 人目は準備完了 4 人目は準備完了 6 人目は準備完了 3 人目は準備完了 10 人目は準備完了 8 人目は準備完了 5 人目は準備完了 7 人目は準備完了 9 人目は準備完了!9 人目到着 7 人目到着 8 人目到着 3 人目到着 6 人目到着待機時間: 970933