CountDownLatchの理解と利用
CountDownLatchはJavaの並行処理ツールであり、スレッドの待ち合わせ機能を実現するために使用されます。他のスレッドの処理が完了するのを待ってから、1つまたは複数のスレッドを再開することができます。
CountDownLatchは、待機を実現するためにカウンタを使用します。カウンタの初期値は正の整数に設定することができ、スレッドがタスクを完了すると、カウンタの値が1つ減少します。カウンタの値が0になると、すべての待機中のスレッドが解放され、実行を続行できます。
CountDownLatchの主なメソッドには次のようなものがあります:
- CountDownLatch(int count):コンストラクターで、カウンターの初期値を設定します。
- await()メソッド:カウンターの値が0になるまで、現在のスレッドを待機させる。
- 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クラスを使用することを検討してください。