当前位置:首页 > Java > 正文

Java CountDownLatch详解(掌握Java并发工具CountDownLatch实现线程同步)

Java并发工具中,CountDownLatch 是一个非常实用的同步辅助类,它允许一个或多个线程等待,直到其他线程完成一组操作。本文将从零开始,用通俗易懂的方式带你彻底掌握 CountDownLatch 的使用方法,即使是编程小白也能轻松上手!

什么是 CountDownLatch?

CountDownLatchjava.util.concurrent 包中的一个类,它的作用就像一个“倒计时门闩”。你可以初始化一个计数器(比如设为3),每当有线程完成任务后就调用 countDown() 方法将计数器减1。而其他需要等待这些任务完成的线程则调用 await() 方法阻塞自己,直到计数器减到0,所有等待的线程才会被唤醒继续执行。

Java CountDownLatch详解(掌握Java并发工具CountDownLatch实现线程同步) CountDownLatch  Java并发工具 线程同步 多线程编程 第1张

CountDownLatch 的核心方法

  • CountDownLatch(int count):构造函数,设置初始计数值。
  • await():使当前线程等待,直到计数器归零(除非线程被中断)。
  • countDown():将计数器减1。
  • getCount():返回当前计数值(仅用于调试和监控)。

实战示例:模拟多线程任务完成后再继续

假设我们有一个主程序,需要等待3个子任务全部完成后才能继续执行。我们可以使用 CountDownLatch 来实现这个需求。

import 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 {        // 初始化一个计数器为3的CountDownLatch        CountDownLatch latch = new CountDownLatch(3);                ExecutorService executor = Executors.newFixedThreadPool(3);                for (int i = 1; i <= 3; i++) {            final int taskId = i;            executor.submit(() -> {                try {                    System.out.println("任务 " + taskId + " 开始执行...");                    Thread.sleep(2000); // 模拟耗时操作                    System.out.println("任务 " + taskId + " 执行完成!");                } catch (InterruptedException e) {                    Thread.currentThread().interrupt();                } finally {                    latch.countDown(); // 任务完成,计数器减1                }            });        }                System.out.println("主线程等待所有任务完成...");        latch.await(); // 主线程在此等待,直到计数器归零        System.out.println("所有任务已完成,主线程继续执行!");                executor.shutdown();    }}

运行上述代码,你会看到类似如下输出:

主线程等待所有任务完成...任务 1 开始执行...任务 2 开始执行...任务 3 开始执行...任务 2 执行完成!任务 1 执行完成!任务 3 执行完成!所有任务已完成,主线程继续执行!

CountDownLatch 的典型应用场景

  • 启动服务前等待依赖初始化完成:例如Web服务器启动前需等待数据库连接池、缓存等组件初始化完毕。
  • 性能测试:让多个线程同时开始执行任务,以模拟高并发场景。
  • 多阶段任务协调:确保某个阶段的所有子任务都完成后才进入下一阶段。

注意事项

  • CountDownLatch 是一次性使用的,计数器一旦归零,就不能重置。如果需要重复使用,请考虑 CyclicBarrier
  • 调用 await() 的线程可能会被中断,因此建议处理 InterruptedException
  • 不要在计数未归零前调用 await() 后的逻辑,否则可能导致程序逻辑错误。

总结

CountDownLatchJava并发工具 中实现 线程同步 的利器,特别适合“等待多个任务完成”的场景。通过本文的学习,你应该已经掌握了它的基本用法和适用场景。在实际的 多线程编程 中,合理使用 CountDownLatch 可以让你的程序结构更清晰、逻辑更可靠。

赶快动手试试吧!如果你有任何疑问,欢迎在评论区留言交流。