Java 语言 并发工具类基础 CountDownLatch的计数等待

Java阿木 发布于 2025-06-25 5 次阅读


摘要:

CountDownLatch是Java并发编程中一个非常有用的工具类,它允许一个或多个线程等待一组事件完成。本文将围绕CountDownLatch的计数等待这一主题,从基本概念、使用方法、注意事项以及实际应用场景等方面进行深入解析。

一、

在多线程编程中,线程间的同步是一个常见且重要的任务。CountDownLatch提供了一种简单而强大的同步机制,使得一组线程可以等待某个事件完成后再继续执行。本文将详细介绍CountDownLatch的使用方法、原理以及在实际开发中的应用。

二、CountDownLatch的基本概念

CountDownLatch是一个同步辅助类,其内部维护了一个计数器,初始值为指定值。当一个线程到达CountDownLatch时,它会递减计数器。当计数器值为0时,表示所有线程都到达了该点,此时所有等待的线程将被释放,继续执行。

CountDownLatch的构造方法如下:

java

public CountDownLatch(int count)


其中,count表示计数器的初始值。

三、CountDownLatch的使用方法

1. 初始化CountDownLatch

java

CountDownLatch latch = new CountDownLatch(3);


这里初始化了一个CountDownLatch,计数器的初始值为3。

2. 线程A等待

java

new Thread(() -> {


System.out.println("线程A开始执行");


try {


latch.await(); // 线程A等待


} catch (InterruptedException e) {


e.printStackTrace();


}


System.out.println("线程A执行完毕");


}).start();


线程A在执行过程中会调用`latch.await()`方法等待,直到计数器值为0。

3. 线程B和线程C执行

java

new Thread(() -> {


System.out.println("线程B开始执行");


latch.countDown(); // 线程B执行完毕,计数器减1


}).start();

new Thread(() -> {


System.out.println("线程C开始执行");


latch.countDown(); // 线程C执行完毕,计数器减1


}).start();


线程B和线程C在执行完毕后,都会调用`latch.countDown()`方法,使计数器减1。

4. 线程A继续执行

当计数器值为0时,线程A将继续执行。

四、CountDownLatch的注意事项

1. CountDownLatch不能重用,每次使用后都需要重新创建。

2. CountDownLatch只能实现一次性的计数等待,如果需要多次等待,需要创建多个CountDownLatch。

3. CountDownLatch的await()方法会抛出InterruptedException异常,需要捕获该异常。

五、CountDownLatch的实际应用场景

1. 等待多个线程完成初始化

java

CountDownLatch latch = new CountDownLatch(3);


new Thread(() -> {


// 线程A初始化


latch.countDown();


}).start();

new Thread(() -> {


// 线程B初始化


latch.countDown();


}).start();

new Thread(() -> {


// 线程C初始化


latch.countDown();


}).start();

latch.await(); // 等待所有线程初始化完成


2. 等待多个任务执行完毕

java

CountDownLatch latch = new CountDownLatch(3);


new Thread(() -> {


// 任务1


latch.countDown();


}).start();

new Thread(() -> {


// 任务2


latch.countDown();


}).start();

new Thread(() -> {


// 任务3


latch.countDown();


}).start();

latch.await(); // 等待所有任务执行完毕


3. 等待多个数据源准备完毕

java

CountDownLatch latch = new CountDownLatch(3);


new Thread(() -> {


// 数据源1准备完毕


latch.countDown();


}).start();

new Thread(() -> {


// 数据源2准备完毕


latch.countDown();


}).start();

new Thread(() -> {


// 数据源3准备完毕


latch.countDown();


}).start();

latch.await(); // 等待所有数据源准备完毕


六、总结

CountDownLatch是Java并发编程中一个非常有用的工具类,它能够帮助我们实现线程间的同步。相信大家对CountDownLatch有了更深入的了解。在实际开发中,CountDownLatch可以帮助我们简化代码,提高程序的性能和可读性。