countdownlatch 是 java 并发包中用于线程同步的工具类,通过维护递减计数器使线程等待其他线程完成指定操作;初始化时指定正整数计数值,每次 countdown() 递减,计数归零后所有 await() 线程被唤醒;它不可重置,适用于一次性等待场景。

CountDownLatch 是 Java 并发包中用于线程间同步的工具类,核心作用是让一个或多个线程等待其他线程完成一组操作后再继续执行。它内部维护一个计数器,每次调用 countDown() 递减,当计数器归零时,所有因 await() 阻塞的线程被唤醒。
初始化与基本用法
创建 CountDownLatch 时需指定初始计数值(正整数):
CountDownLatch latch = new CountDownLatch(3);这个“3”表示:必须有 3 次 countDown() 调用,才能使后续调用 await() 的线程解除阻塞。
主线程等待多个子线程完成
典型场景:主线程启动若干任务线程,需等它们全部结束才继续处理结果。
- 主线程创建
CountDownLatch(任务数) - 每个子线程执行完自己的逻辑后,调用
latch.countDown() - 主线程在关键位置调用
latch.await()—— 此处会阻塞,直到计数为 0
示例片段:
CountDownLatch latch = new CountDownLatch(2);new Thread(() -> { doWork(); latch.countDown(); }).start();
new Thread(() -> { doWork(); latch.countDown(); }).start();
latch.await(); // 主线程在此等待,直到两个子线程都调用 countDown()
System.out.println("全部完成");
注意超时与中断处理
await() 有带超时和响应中断的重载版本,避免无限等待:
-
latch.await(5, TimeUnit.SECONDS):最多等 5 秒,超时返回false,可据此判断是否失败 -
latch.await()可被中断:若当前线程被interrupt(),抛出InterruptedException,需捕获并处理(如恢复中断状态)
计数器不可重置
CountDownLatch 是一次性使用的——计数器归零后,所有后续 await() 立即返回,countDown() 也不再影响状态。如需重复使用,请考虑 CyclicBarrier 或手动重建实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











