CountDownLatchの理解と利用

CountDownLatchはJavaの並行処理ツールであり、スレッドの待ち合わせ機能を実現するために使用されます。他のスレッドの処理が完了するのを待ってから、1つまたは複数のスレッドを再開することができます。

CountDownLatchは、待機を実現するためにカウンタを使用します。カウンタの初期値は正の整数に設定することができ、スレッドがタスクを完了すると、カウンタの値が1つ減少します。カウンタの値が0になると、すべての待機中のスレッドが解放され、実行を続行できます。

CountDownLatchの主なメソッドには次のようなものがあります:

  1. CountDownLatch(int count):コンストラクターで、カウンターの初期値を設定します。
  2. await()メソッド:カウンターの値が0になるまで、現在のスレッドを待機させる。
  3. countDown():カウンターの値を1減らす。

以下是一个使用CountDownLatch的例子:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);  // 设置计数器的初始值为3

        Worker worker1 = new Worker(latch, "Worker1");
        Worker worker2 = new Worker(latch, "Worker2");
        Worker worker3 = new Worker(latch, "Worker3");

        worker1.start();
        worker2.start();
        worker3.start();

        latch.await();  // 等待所有线程执行完毕

        System.out.println("All workers have finished their tasks.");
    }
}

class Worker extends Thread {
    private CountDownLatch latch;

    public Worker(CountDownLatch latch, String name) {
        super(name);
        this.latch = latch;
    }

    public void run() {
        try {
            Thread.sleep(1000);  // 模拟任务执行时间
            System.out.println(getName() + " has finished its task.");
            latch.countDown();  // 计数器的值减1
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上の例では、CountDownLatchオブジェクトを作成し、初期値を3に設定しました。次に、3つのWorkerスレッドを作成し、それらにタスクを実行させました。各Workerスレッドはタスクを完了すると、countDown()メソッドを呼び出してカウンターの値を1減らします。メインスレッドはawait()メソッドを呼び出して、カウンターの値が0になるまで待機し、すべてのWorkerスレッドがタスクを完了した後にのみ、メインスレッドが続行します。

注意:CountDownLatchのカウンターは一度しか使用できず、カウンターの値がゼロになると他の値にリセットすることはできません。カウンターを複数回使用する必要がある場合は、CyclicBarrierクラスを使用することを検討してください。

bannerAds