什么是CountDownLatch?
CountDownLatch是Java并发包(java.util.concurrent
)中的一个同步辅助类,用来协调多个线程之间的协作。它允许一个或多个线程等待,直到其他线程完成一组操作。
CountDownLatch的基本原理
CountDownLatch通过一个计数器来实现这个功能。这个计数器的初始值是通过构造函数设置的,每当一个线程完成了它的任务后,计数器的值就会减一。当计数器的值减到零时,所有等待的线程都会被唤醒,继续执行各自的操作。
CountDownLatch的主要方法
- await():这个方法会让当前线程等待,直到计数器的值减到零。如果计数器已经是零,线程不会被阻塞。
- countDown():这个方法会将计数器的值减一。调用这个方法的线程不会被阻塞。
CountDownLatch的用途
CountDownLatch可以用于多种场景,以下是一些常见的用途:
- 多线程启动协调:可以让主线程等待,直到所有工作线程都准备好后再继续执行。
- 并行计算结果合并:可以让主线程等待,直到所有分任务都完成后,再汇总结果。
- 模拟并发测试:可以让多个线程同时开始执行,以模拟并发场景进行测试。
CountDownLatch的使用步骤
- 初始化CountDownLatch:在需要的地方创建一个CountDownLatch对象,并设置计数器的初始值。
- 线程等待:在需要等待其他线程的地方调用
await()
方法。 - 线程完成任务:在每个工作线程完成任务后调用
countDown()
方法。
举个例子来说明
假设我们有一个主线程和三个工作线程,主线程需要等待这三个工作线程都完成任务后再继续执行。我们可以使用CountDownLatch来实现:
- 初始化:创建一个CountDownLatch对象,并将计数器初始值设为3。
- 主线程等待:在主线程中调用
await()
方法,等待计数器减到零。 - 工作线程执行任务并计数:每个工作线程在完成任务后调用
countDown()
方法,将计数器减一。
当三个工作线程都调用了countDown()
方法后,计数器的值就会减到零,此时主线程会被唤醒,继续执行后续操作。
总结
- CountDownLatch:一个同步辅助类,用于协调多个线程之间的协作。
- 基本原理:通过一个计数器来控制,计数器的值减到零时,所有等待的线程会被唤醒。
- 主要方法:
await()
让线程等待,countDown()
减少计数器的值。 - 常见用途:多线程启动协调、并行计算结果合并、模拟并发测试等。
通过CountDownLatch,可以更方便地实现线程之间的协调和同步,确保多个线程能够按照预期的顺序执行。