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

Java计数锁存器详解(CountDownLatch入门与实战指南)

在Java多线程编程中,我们经常需要协调多个线程之间的执行顺序。比如:主线程需要等待多个子任务全部完成后再继续执行。这时,Java计数锁存器(CountDownLatch)就派上用场了!

Java计数锁存器详解(CountDownLatch入门与实战指南) Java计数锁存器 CountDownLatch教程 Java并发工具 多线程同步 第1张

什么是CountDownLatch?

CountDownLatch 是 Java 并发包(java.util.concurrent)中的一个同步辅助类。它允许一个或多个线程等待,直到其他线程完成一组操作。

你可以把它想象成一个“倒计时门闩”:初始设定一个计数值(比如5),每完成一个任务就减1,当计数减到0时,所有等待的线程就会被释放,继续执行后续代码。

核心方法

  • CountDownLatch(int count):构造函数,设置初始计数值。
  • await():调用此方法的线程会被阻塞,直到计数器变为0。
  • countDown():将计数器减1。通常由完成任务的线程调用。

简单示例:等待所有工人完工

假设你是一个项目经理,有3个工人(线程)在干活,你必须等他们都干完才能下班。用 Java计数锁存器 实现如下:

import java.util.concurrent.CountDownLatch;public class WorkerExample {    public static void main(String[] args) throws InterruptedException {        // 创建一个计数为3的CountDownLatch        CountDownLatch latch = new CountDownLatch(3);        // 启动3个工作线程        for (int i = 1; i <= 3; i++) {            new Thread(() -> {                try {                    System.out.println(Thread.currentThread().getName() + " 开始工作...");                    Thread.sleep(2000); // 模拟工作耗时                    System.out.println(Thread.currentThread().getName() + " 完成工作!");                } catch (InterruptedException e) {                    e.printStackTrace();                } finally {                    latch.countDown(); // 工作完成,计数减1                }            }, "Worker-" + i).start();        }        // 主线程等待所有工人完成        System.out.println("项目经理等待所有工人完工...");        latch.await(); // 阻塞直到计数为0        System.out.println("所有工作完成,项目经理下班!");    }}  

运行结果大致如下:

项目经理等待所有工人完工...Worker-1 开始工作...Worker-2 开始工作...Worker-3 开始工作...Worker-1 完成工作!Worker-3 完成工作!Worker-2 完成工作!所有工作完成,项目经理下班!  

注意事项

  • 计数器一旦归零,就不能重置。如果需要重复使用,请考虑 CyclicBarrier
  • await() 可以被中断,会抛出 InterruptedException
  • 多个线程可以同时调用 await(),它们都会在计数归零后继续执行。

应用场景

Java并发工具 CountDownLatch 常用于以下场景:

  • 启动服务前等待多个资源初始化完成。
  • 性能测试:等待所有并发线程就绪后再开始计时。
  • 多线程数据处理完成后汇总结果。

总结

CountDownLatch 是一个强大而简单的 多线程同步 工具。通过它,我们可以轻松实现“等待N个事件完成后再继续”的逻辑。对于初学者来说,掌握它是迈向高级并发编程的重要一步。

记住:合理使用 CountDownLatch教程 中介绍的方法,能让你的多线程程序更清晰、更可靠!