CountDownLatch
是 Java 中的一個同步工具類,它允許一個或多個線程等待一系列指定操作執行完成。CountDownLatch
的主要方法有兩個:await()
方法等待 countDown
方法被調用指定的次數後繼續執行,countDown
方法遞減計數器,每次調用都會減少計數器的值。
如果你想要使用 CountDownLatch
來關閉線程,你可以這樣做:
-
創建一個
CountDownLatch
實例,並指定初始計數值。 -
每個需要等待的線程在開始執行的地方調用
await
方法。 -
當所有需要等待的操作完成時,調用
countDown
方法。 -
如果你想關閉線程,可以通過調用
countDown
方法來減少CountDownLatch
的計數值。
下面是一個簡單的例子,展示瞭如何使用 CountDownLatch
來關閉線程:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolShutdown {
public static void main(String[] args) {
int numberOfTasks = 10;
CountDownLatch doneSignal = new CountDownLatch(numberOfTasks);
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < numberOfTasks; i++) {
executor.execute(new RunnableTask(doneSignal, i));
}
try {
doneSignal.await(); // 等待所有任務完成
} catch (InterruptedException e) {
e.printStackTrace();
executor.shutdownNow(); // 中斷等待過程中,立即關閉線程池
}
executor.shutdown(); // 正常關閉線程池
}
static class RunnableTask implements Runnable {
private final CountDownLatch doneSignal;
private final int i;
RunnableTask(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}
@Override
public void run() {
try {
System.out.println("Task " + i + " is executing");
Thread.sleep((long) (Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
doneSignal.countDown(); // 每個任務完成時減少計數器
}
}
}
}