CountDownLatch
是 Java 并发库中的一个同步工具类,它允许一个或多个线程等待一系列指定操作完成。CountDownLatch
的主要方法有两个:await()
方法和 countDown()
方法。
await()
方法用于阻塞当前线程直到 countDown()
被调用指定的次数。countDown()
方法用于将 CountDownLatch
的计数器减 1,当计数器达到 0 时,所有等待的线程将被释放。
以下是一个简单的 CountDownLatch
使用示例,其中创建了一个 CountDownLatch
实例,初始计数器设置为 5,然后启动了 5 个线程,每个线程完成自己的任务后调用 countDown()
方法。主线程等待直到计数器为 0,然后继续执行。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
// 初始化十个线程
CountDownLatch latch = new CountDownLatch(10);
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 5; i++) {
final int taskId = i;
executor.submit(new Runnable() {
public void run() {
try {
Thread.sleep((long) (Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + taskId + " is done.");
// 每完成一个线程 CountDownLatch 会减1
latch.countDown();
}
});
}
//CountDownLatch 为0 时说明所有的线程都结束了
latch.await(); // 等待所有任务完成
executor.shutdown();
}
}
这个只能用于线程只使用一次,如果线程时复用的就不能使用了,和FutureTask 各有所长