推荐答案
CountDownLatch 是 Java 并发包中的一个同步工具类,用于协调多个线程之间的同步操作。它允许一个或多个线程等待其他线程完成操作后再继续执行。
本题详细解读
1. CountDownLatch 的基本概念
CountDownLatch 通过一个计数器来实现同步。计数器的初始值由构造函数指定,表示需要等待的线程数量。每当一个线程完成了自己的任务后,计数器的值就会减一。当计数器的值减到零时,表示所有需要等待的线程都已经完成了任务,此时等待的线程(通常是主线程)就可以继续执行。
2. CountDownLatch 的主要方法
CountDownLatch(int count): 构造函数,初始化计数器,count表示需要等待的线程数量。void await(): 使当前线程等待,直到计数器的值减到零。如果计数器的值已经为零,则该方法立即返回。boolean await(long timeout, TimeUnit unit): 使当前线程等待,直到计数器的值减到零,或者等待时间超过指定的超时时间。如果计数器的值在超时时间内减到零,则返回true,否则返回false。void countDown(): 将计数器的值减一。如果计数器的值减到零,则所有等待的线程将被唤醒。long getCount(): 返回当前计数器的值。
3. CountDownLatch 的使用场景
CountDownLatch 通常用于以下场景:
- 主线程等待多个子线程完成任务后再继续执行:例如,主线程需要等待多个子线程完成初始化操作后再执行后续任务。
- 多个线程等待某个事件发生后再继续执行:例如,多个线程需要等待某个资源初始化完成后才能开始执行任务。
4. 示例代码
// www.javascriptcn.com code example
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
int threadCount = 3;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " is running");
latch.countDown(); // 计数器减一
}).start();
}
latch.await(); // 主线程等待所有子线程完成任务
System.out.println("All threads have finished their tasks");
}
}在这个示例中,主线程创建了 3 个子线程,并使用 CountDownLatch 来等待所有子线程完成任务。每个子线程完成任务后调用 countDown() 方法将计数器减一,主线程通过 await() 方法等待计数器减到零后再继续执行。
5. 注意事项
CountDownLatch的计数器只能减不能增,一旦计数器减到零,就不能再重置。CountDownLatch适用于一次性同步操作,如果需要多次同步,可以考虑使用CyclicBarrier。