CountDownLatch简介
CountDownLatch
是 Java 并发包 java.util.concurrent
中的一个类,它允许一个或多个线程等待其他线程完成一组操作。CountDownLatch
是一种同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法
CountDownLatch(int count)
:构造函数接收一个整数count
作为参数,表示计数器的初始值。这个值表示需要等待的事件数量。void await()
:使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。void await(long timeout, TimeUnit unit)
:使当前线程在锁存器倒计数至零之前等待,除非线程被中断或超出了指定的等待时间。void countDown()
:递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
使用场景
CountDownLatch
通常用于以下场景:
- 等待多个线程完成:当你有多个线程正在执行,并且你希望等待所有这些线程都完成后再继续执行其他操作时,可以使用
CountDownLatch
。 - 并行计算的启动屏障:在并行计算中,你可能需要等待所有并行任务都准备好后再开始执行。此时,可以将
CountDownLatch
的初始值设置为并行任务的数量,每个任务在开始执行前都调用countDown()
方法,而主线程则调用await()
方法等待所有任务都准备就绪。
示例代码
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
int numberOfThreads = 5;
CountDownLatch latch = new CountDownLatch(numberOfThreads);
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
for (int i = 0; i < numberOfThreads; i++) {
final int threadNum = i;
executor.submit(() -> {
try {
// 模拟任务执行
Thread.sleep(1000);
System.out.println("Thread " + threadNum + " is done.");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
latch.countDown();
}
});
}
// 等待所有线程完成
latch.await();
System.out.println("All threads have completed.");
executor.shutdown();
}
}
在这个例子中,我们创建了一个包含 5 个线程的线程池,每个线程都执行一个模拟任务(通过 Thread.sleep(1000)
实现)。每个线程在完成任务后都会调用 latch.countDown()
来减少计数器的值。主线程调用 latch.await()
等待,直到计数器的值减到 0,即所有线程都完成了任务。然后,主线程继续执行并打印出所有线程都已完成的消息。