JavaのCountDownLatchの利用方法
CountDownLatch は Java の同期補助クラスで、1 つ以上のスレッドが他のスレッドの操作完了を待ってから続行できます。
- 主スレッドは、複数のサブスレッドが終了するまで待機してから実行します。
- 主スレッドがタスクを完了するまで、複数のサブスレッドは待機してから実行を開始します。
CountDownLatchを使う手順は以下の通りです。
- 指定した数のスレッドが待機するまでブロックするCountDownLatchオブジェクトを生成します。
- 待機が必要なスレッド内でCountDownLatchのawait()メソッドを呼ぶと、スレッドはカウンターが0になるまで待機状態に移行する。
- 別スレッドで必要な処理が終了したら、CountDownLatchのcountDown()メソッドを呼び出し、カウントを1減らします。
- 主スレッドが他のスレッドの完了を待機する必要がある場合、主スレッドでCountDownLatchのawait()メソッドを呼び出すことで、主スレッドを待機状態にすることができます。
- カウンタが0になると待機していたスレッドがすべて解除され、実行が再開される
以下に簡単なサンプルコードを示します。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) {
int threadCount = 5;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(new WorkerThread(latch));
thread.start();
}
try {
latch.await(); // 主线程等待所有子线程执行完毕
System.out.println("All threads have finished.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class WorkerThread implements Runnable {
private CountDownLatch latch;
public WorkerThread(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
// 执行需要等待的任务
System.out.println("Thread " + Thread.currentThread().getName() + " is running.");
// 任务执行完毕后,调用countDown()方法将计数器减1
latch.countDown();
}
}
上のサンプルコードでは、メインスレッドは5つのWorkerThreadスレッドを作成し、CountDownLatchオブジェクトを引数として渡しています。WorkerThreadスレッドは各自のタスクを実行し終えた後に、latch.countDown()メソッドを呼び出してカウンタを1つ減らします。メインスレッドは、latch.await()メソッドを呼び出してカウンタが0になるまで待機状態に入り、全てのワーカースレッドが終了したことを確認します。最後に、メインスレッドは「All threads have finished.」を出力します。