複数のスレッドが終了するのを Java で待機する方法
Javaでは、CountDownLatchクラスを使用して複数のスレッドが終了するのを待つことができます。
CountDownLatchはJavaが提供する同期ヘルパークラスであり、1つまたは複数のスレッドが別のスレッドの操作を完了するのを待ってから実行を続行できます。
具体的な手順は以下のとおりです。
- カウントダウンラッチオブジェクトを作成し、カウンターをスレッド数に初期化します。
- 各スレッドの処理終了後にCountDownLatchオブジェクトのcountDown()メソッドを呼び出し、そのカウントを1つ減らします。
- メインスレッドでCountDownLatchオブジェクトのawait()メソッドを呼び出して、全てのスレッドの処理を待って、カウンタが0になったらメインスレッドは処理を再開します。
以下のサンプルコードでは、
import java.util.concurrent.CountDownLatch;
public class WaitMultipleThreads {
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 MyRunnable(latch));
thread.start();
}
try {
latch.await(); // 等待所有线程执行完成
System.out.println("All threads have finished.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class MyRunnable implements Runnable {
private final CountDownLatch latch;
public MyRunnable(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
// 线程操作逻辑
// ...
latch.countDown(); // 线程执行完毕,计数器减1
}
}
}
この例ではまずCountDownLatchオブジェクトを作成し、カウントを 5 に初期化しました。次に、ループを使用して 5 つのスレッドを作成し、CountDownLatchオブジェクトを各スレッドのコンストラクタにパラメータとして渡します。
各スレッドのrun()メソッド内で、スレッド処理のロジックを実行し、最後にlatch.countDown()メソッドを呼び出すことでカウントを1減らす
最後に、メインスレッドで latch.await() メソッドを呼び出し、全スレッドの実行完了を待ちます。カウンタが0になると、メインスレッドが実行を再開し、「All threads have finished」と出力します。