この記事では、主にマルチスレッド同期のためのJavaのCountDownLatchの詳細な説明とサンプルコードを紹介します。必要な友人はそれを参照してください
JavaのCountDownLatchのマルチスレッド同期の詳細な説明
CountDownLatchの紹介
前回の Java 学習ノートでは、Java でのマルチスレッド同期のいくつかの方法をまとめました:
1、synchronized 同期キーワード。
2. ロック インターフェース とその実装クラス ReentrantLock、ReadWriteLock ロックは同期を実現します。
3. セマフォは同期を実現します。
その中で、synchronized キーワードと Lock ロックは、複数のスレッドによる同じリソースへの同時アクセスの問題を解決します。セマフォは、リソースの複数のコピーへの共有アクセスの問題を解決します。
今日は、Java の別のマルチスレッド同期補助クラス、CountDownLatch について学びましょう。公式ドキュメントでは、CountDownLatch を次のように説明しています。これにより、1 つ以上のスレッドが、他のスレッドで実行されている一連の操作が完了するまで待機できるようになります。つまり、CountDownLatch は 1 つ以上のスレッドを制御し、開始する前に複数のスレッドが特定のタスクを完了するまで待機させます。 CountDownLatch は主に、複数のタスクの実行を同期するために使用され、共有リソースの同期に使用される他の同期キーワード、ロック、セマフォとは異なります。
CountDownLatch の実装原理の紹介:
CountDownLatch は、内部的にカウンターを維持します。カウンターの値は、完了するタスクの数 N です。スレッドは、これらの N タスクの完了を待機する必要があります。
CountDownLatchのawait()メソッドを呼び出して自身をスリープ待機状態にします。
タスクスレッドはタスクが完了すると、CountDownLatchのcountDown()メソッドを呼び出してタスクが完了したことを示します。このとき、CountDownLatchのカウンタ値は1減ります。すべてのタスクが完了すると、カウンタ値が0です。カウンタ値が 0 の場合、CountDownLatch は、await() メソッドによってスリープ状態になったすべてのスレッドをウェイクアップします。
CountDownLatch の使用法:
CountDownLatch を使用するには、主に 3 つのポイントがあります:
1. 初期化中に、完了を待機しているタスクの数を指定する必要があります。
2. 特定のタスクが完了したら、CountDownLatch の countDown() メソッドを呼び出し、そのタスクが完了したことを CountDownLatch に報告します。
3. タスクの完了を待つ必要があるスレッドは、 CountDownLatch の await() メソッドの呼び出し後、スレッドはスリープ状態に入り、すべてのタスクが完了して CountDownLatch のカウンタ値が 0 に達すると、await() メソッドによってスリープしていたスレッドが目覚めます。
ここでは、CountDownLatch の使用方法の詳細を示すために、Java 7 同時プログラミング実践マニュアルの CountDownLatch の使用例に基づいていくつかの改良を加えました。
会議では、10 人の参加者と主催者をシミュレートします。他の参加者が会議を開始して発言できるようになるまで、サインインを待ちます。これを行うには、まず、管理対象となるクラス VideoConference を作成します。このクラスは、参加者がチェックインするために呼び出すことのできる、arrivy() メソッドを提供します。会議管理の所有者はホストであり、各参加者がサインインするのを待ちます:
public class VideoConference implements Runnable{ private final CountDownLatch countDownLatch; private int number; public VideoConference(int number) { this.number = number; this.countDownLatch = new CountDownLatch(number);//使用Number初始化其内部的计数器,当初始化完成后,不能再次初始化 } public void arrive(String name){ //每个需要同步的任务,在任务完成时,需要调用该方法 countDownLatch.countDown();//countDownLatch内部的计数器减1 System.out.print("arrive:"+name+"\n"); try{ countDownLatch.await();//await方法是线程进入休眠,当countDownLatch计数器为0时,将被唤醒 //线程被唤醒,在这里可以执行一系列任务 System.out.print("name:"+name + " say:let's start..." +"\n"); }catch (InterruptedException e){ e.printStackTrace(); } } public void run(){ System.out.print("has arrive:"+(number-countDownLatch.getCount())+"\n"); try{ countDownLatch.await();//await方法是线程进入休眠,当countDownLatch计数器为0时,将被唤醒 //线程被唤醒,在这里可以执行一系列任务 System.out.print("all arrived:"+(number-countDownLatch.getCount())+"\n"); }catch (InterruptedException e){ e.printStackTrace(); } } }
参加者クラスを作成します 参加者:
public class Participant implements Runnable{ private VideoConference videoConference; private String name; public Participant(String name, VideoConference videoConference) { this.name = name; this.videoConference = videoConference; } public void run(){ try { //do something Thread.sleep(50); // videoConference.arrive(name); }catch (InterruptedException e){ e.printStackTrace(); } } public static void main(String[] args){ VideoConference videoConference = new VideoConference(10); Thread videoThread = new Thread(videoConference); videoThread.start(); for(int i=0; i<10; i++){ Thread thread = new Thread(new Participant("participant:"+i,videoConference)); thread.start(); } } }
参加者クラスの主要な機能最初に 10 人の参加者が必要な会議を作成します その後, 10 人の参加者が作成され、1 人ずつサインインすると、各参加者とホストが「覚醒」して発言します。
概要:
CountDownLatch クラスは、マルチスレッド間の同期待ちとタスク調整の問題を解決します。たとえば、プログラムの main 関数を開始する前に、構成環境を完了する必要があります。チェック、ネットワーク チェックなど。複数のサブタスクと同様のシナリオ。 Java では、CountDownLatch を使用して複数のスレッド間の同期待機を実現するだけでなく、バリア テクノロジ CyclicBarrier を使用して複数のスレッド間の同期待機とタスク調整を実現することもできます。
以上がJava でのマルチスレッド同期のための CountDownLatch のコード共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。