当前位置:实例文章 » JAVA Web实例» [文章]CountDownLatch 一个神奇的计数器,您了解吗

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,我们可以简化多线程编程的复杂性,使得代码更加易于理解和维护。

相关标签:算法java开发语言
其他信息

其他资源

Top