CountDownLatch 一个神奇的计数器,您了解吗
发布人:shili8
发布时间:2025-03-01 09:08
阅读次数:0
**CountDownLatch:一个神奇的计数器**
在多线程编程中,经常会遇到这样的场景:需要等待某些线程执行完毕后再继续执行。例如,在一个并发计算任务中,我们可能需要等待所有子线程都完成计算后才返回结果。在这种情况下,CountDownLatch就派上用场了。
**什么是CountDownLatch**
CountDownLatch(简称CND)是一种特殊的锁,它允许一个或多个线程等待其他线程执行完毕。它通过维护一个计数器来实现这一点。当某些线程完成任务后,会将计数器减一;当计数器变为零时,等待线程就可以继续执行。
**CountDownLatch的使用场景**
1. **并发计算**: 在多线程环境中,需要等待所有子线程都完成计算后才返回结果。
2. **任务调度**: 需要等待某些任务完成后再继续执行其他任务。
3. **资源释放**: 需要等待某些资源被释放后再继续使用其他资源。
**CountDownLatch的API**
下面是CountDownLatch的主要API:
* `CountDownLatch(int count)`: 构造函数,指定计数器初始值为count。
* `void await()`: 等待线程,直到计数器变为零。
* `void awaitUninterruptibly()`: 不可中断等待线程,直到计数器变为零。
* `boolean await(long timeout, TimeUnit unit)`: 等待线程,直到计数器变为零或超时。
* `int getCount()`: 获取当前计数器值。
* `void countDown()`: 将计数器减一。
**示例代码**
javaimport 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 { // 构造一个CountDownLatch对象,初始值为3 CountDownLatch latch = new CountDownLatch(3); // 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(4); // 启动三个子线程 for (int i =0; i < 3; i++) { final int index = i; executor.submit(() -> { System.out.println("子线程 " + index + " 正在执行..."); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // 子线程完成后,将计数器减一 latch.countDown(); System.out.println("子线程 " + index + " 完成!"); }); } // 等待所有子线程完成后继续执行 latch.await(); System.out.println("主线程继续执行..."); } }
在这个示例中,我们使用CountDownLatch来等待三个子线程都完成后再继续执行。每个子线程在完成任务后都会将计数器减一。当计数器变为零时,主线程就可以继续执行。
**总结**
CountDownLatch是一个非常有用的工具,它允许一个或多个线程等待其他线程执行完毕。在多线程编程中,经常会遇到这样的场景:需要等待某些线程执行完毕后再继续执行。例如,在一个并发计算任务中,我们可能需要等待所有子线程都完成计算后才返回结果。在这种情况下,CountDownLatch就派上用场了。
通过使用CountDownLatch,我们可以简化多线程编程的复杂性,使得代码更加易于理解和维护。