在Java中如何使用CountDownLatch_Java并发协作工具解析

千丽酱_7730

千丽酱_7730

2026-01-13

1011人浏览

原创

CountDownLatch 是一个一次性同步辅助类,用于让一个或多个线程等待其他线程完成指定数量的操作;适用于主线程等待多个子任务(如批量 HTTP 请求)全部完成后再汇总结果的场景。

在java中如何使用countdownlatch_java并发协作工具解析

CountDownLatch 是什么,什么时候该用它

CountDownLatch 不是锁,而是一个同步辅助类,用来让一个或多个线程等待其他线程完成一组操作。典型场景是:主线程启动若干子任务(比如 5 个 HTTP 请求),等它们全部返回后再汇总结果——这时 CountDownLatch 比轮询或 join() 更可控、更轻量。

它内部维护一个计数器,初始化时指定值;每次调用 countDown() 就减 1;调用 await() 的线程会阻塞,直到计数器归零或被中断。

初始化和基本用法要注意哪些坑

最常见错误是把 CountDownLatch 初始化为 0:此时 await() 不会阻塞,直接返回,导致逻辑提前执行。另一个坑是重复调用 countDown() 超过初始值,虽然不会报错,但可能掩盖逻辑错误(比如本该只触发一次的清理动作被多执行)。

  • 计数值必须大于 0 才有意义,new CountDownLatch(0) 适合“立即放行”场景,但需明确意图
  • 每个参与协作的线程应且仅调用一次 countDown(),建议放在 finally 块里防异常跳过
  • await() 可带超时参数,避免无限等待;返回 false 表示超时,需主动处理失败路径

和 CyclicBarrier、Semaphore 的关键区别在哪

三者都用于线程协作,但语义不同:CyclicBarrier 是“大家一起到齐才出发”,可重用;Semaphore 控制并发数,类似限流器;而 CountDownLatch 是“等别人干完我再动”,一次性且不可重置。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载

如果需要多次等待同一组事件(比如每轮批处理都等 10 个任务完成),别硬用 CountDownLatch —— 它不能 reset,得换 CyclicBarrier 或手动 new 新实例(不推荐,易泄漏)。

  • CountDownLatch:单次倒计时,不可重用
  • CyclicBarrier:可重复使用,支持到达时触发回调(Runnable)
  • Semaphore:控制同时访问资源的线程数,和“等待完成”无直接关系

一个真实可用的 HTTP 批量请求示例

下面代码模拟 3 个异步请求并发执行,主线程等待全部完成。注意异常处理、超时控制和资源释放:

CountDownLatch latch = new CountDownLatch(3);
List<string> results = Collections.synchronizedList(new ArrayList());

for (int i = 0; i  {
        try {
            // 模拟网络请求
            String result = "response-" + taskId;
            Thread.sleep(1000L);
            results.add(result);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            latch.countDown(); // 确保一定执行
        }
    }).start();
}

try {
    if (!latch.await(5, TimeUnit.SECONDS)) {
        System.err.println("Timeout waiting for all tasks");
        return;
    }
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    return;
}

System.out.println("All done: " + results);
</string>

实际项目中,更推荐用 CompletableFuture 替代手写 CountDownLatch,尤其在需要链式处理、异常传播或组合多个异步结果时。但理解 CountDownLatch 的底层协作模型,对排查并发问题仍有直接帮助。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4578

6

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

3823

4

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

2023.11.14

954

3

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2024.03.12

6706

8

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

5510

6

Go 语言 HTTP 编程与中间件开发教程合集
Go 语言 HTTP 编程与中间件开发教程合集

全面讲解 Go 语言 HTTP 编程的核心知识,涵盖 net/http 标准库的 Server/Handler/HandlerFunc 体系、DefaultServeMux 路由注册与自定义路由器、Request / ResponseWriter 请求响应处理、中间件(Middleware)链式设计模式与常见中间件(日志/CORS/认证/限流)开发、http.Client 的超时配置与连接池管理、Cookie / Session 处理、

2026.05.08

561

31

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习