在Java中如何使用CountDownLatch实现线程依赖控制_CountDownLatch实践指南

CountDownLatch是Java中用于线程同步的工具,通过计数器控制线程等待;初始化指定计数值,调用countDown()递减,await()阻塞线程直到计数为零,实现主线程等待多线程完成或统一触发多线程执行,且计数器不可重置,适用于一次性同步场景。

在java中如何使用countdownlatch实现线程依赖控制_countdownlatch实践指南

在多线程编程中,经常需要控制多个线程的执行顺序或等待某些任务完成后再继续。Java 提供了 CountDownLatch 工具类来实现这种线程间的协调。它基于一个计数器,当计数器归零时,所有被阻塞的线程将被唤醒并继续执行。

CountDownLatch 是什么?

CountDownLatch 是 java.util.concurrent 包下的一个同步工具类,它允许一个或多个线程等待其他线程完成一组操作。它的核心机制是通过一个初始化的计数值,调用 countDown() 方法递减计数,而调用 await() 的线程会阻塞直到计数变为 0。

典型使用场景包括:

主线程等待多个子任务完成后再继续多个线程等待某个公共准备动作完成后再开始执行测试中模拟并发请求,统一触发

基本用法:主线程等待子线程完成

假设我们要启动 3 个线程执行任务,主线程需要等它们全部完成后才打印“所有任务完成”。

立即学习“Java免费学习笔记(深入)”;

import java.util.concurrent.CountDownLatch;public class Worker implements Runnable {    private CountDownLatch latch;    public Worker(CountDownLatch latch) {        this.latch = latch;    }    @Override    public void run() {        try {            // 模拟任务执行            System.out.println(Thread.currentThread().getName() + " 正在工作...");            Thread.sleep(1000);        } catch (InterruptedException e) {            Thread.currentThread().interrupt();        } finally {            latch.countDown(); // 任务完成,计数减一        }    }    public static void main(String[] args) throws InterruptedException {        CountDownLatch latch = new CountDownLatch(3); // 计数设为3        Thread t1 = new Thread(new Worker(latch), "Worker-1");        Thread t2 = new Thread(new Worker(latch), "Worker-2");        Thread t3 = new Thread(new Worker(latch), "Worker-3");        t1.start();        t2.start();        t3.start();        latch.await(); // 主线程阻塞,直到计数为0        System.out.println("所有工作线程已完成,主线程继续执行。");    }}

输出示例:

ViiTor实时翻译 ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116 查看详情 ViiTor实时翻译

Worker-1 正在工作...Worker-2 正在工作...Worker-3 正在工作...所有工作线程已完成,主线程继续执行。

反向使用:子线程等待主线程指令

有时我们希望多个线程准备好后,由主线程统一发令同时开始执行。这时可以将 CountDownLatch 初始化为 1,让所有子线程调用 await() 等待,主线程调用 countDown() 触发执行。

import java.util.concurrent.CountDownLatch;public class RaceExample {    public static void main(String[] args) throws InterruptedException {        CountDownLatch startSignal = new CountDownLatch(1);        for (int i = 1; i  {                try {                    System.out.println(Thread.currentThread().getName() + " 准备就绪,等待起跑信号...");                    startSignal.await(); // 所有线程在此等待                    System.out.println(Thread.currentThread().getName() + " 开始奔跑!");                } catch (InterruptedException e) {                    Thread.currentThread().interrupt();                }            }, "Runner-" + i).start();        }        Thread.sleep(2000); // 模拟准备时间        System.out.println("发令枪响!");        startSignal.countDown(); // 发令,所有线程同时开始    }}

这种模式常用于性能测试或并发场景模拟,确保多个线程真正“同时”启动。

注意事项与最佳实践

使用 CountDownLatch 虽然简单,但也要注意以下几点:

计数器只能使用一次,一旦归零无法重置。如需重复使用,考虑 CyclicBarrier避免在 countDown() 中抛出异常导致计数未正确减少,建议放在 finally 块中await() 可能被中断,应处理 InterruptedException可使用带超时的 await(long timeout, TimeUnit unit),避免无限等待

例如使用超时机制:

“`javaif (latch.await(5, TimeUnit.SECONDS)) { System.out.println(“所有任务在5秒内完成”);} else { System.out.println(“等待超时,部分任务可能未完成”);}“`

基本上就这些。CountDownLatch 是实现线程依赖控制的轻量级方案,理解其“倒计数、一次性、等待归零”的特性,就能在合适的场景中有效使用。

以上就是在Java中如何使用CountDownLatch实现线程依赖控制_CountDownLatch实践指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/287791.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
怎么看 linux 是否安装了 mysql
上一篇 2026年10月20日 04:31:01
使用 CSS Transform 实现元素定位与动画
下一篇 2025年12月20日 06:18:08

相关推荐

  • 谷歌浏览器总提示“页面崩溃”怎么办 谷歌浏览器错误页面修复技巧

    谷歌浏览器总提示“页面崩溃”怎么办 谷歌浏览器错误页面修复技巧谷歌浏览器总提示“页面崩溃”怎么办 谷歌浏览器错误页面修复技巧谷歌浏览器总提示“页面崩溃”怎么办 谷歌浏览器错误页面修复技巧谷歌浏览器总提示“页面崩溃”怎么办 谷歌浏览器错误页面修复技巧

    谷歌浏览器频繁提示“页面崩溃”通常由扩展、缓存、硬件加速或系统资源问题引起。2. 可通过禁用扩展、清除浏览数据、关闭硬件加速、更新浏览器和释放系统资源等步骤排查解决。 谷歌浏览器频繁提示“页面崩溃”或“网页已停止工作”,通常和扩展、缓存、硬件加速或系统资源有关。直接重启浏览器可能暂时解决,但想彻底修…

    2026年10月20日 • 用户投稿
    000
  • 集成VSCode自动化测试运行器与覆盖率可视化仪表盘

    集成VSCode自动化测试运行器与覆盖率可视化仪表盘集成VSCode自动化测试运行器与覆盖率可视化仪表盘集成VSCode自动化测试运行器与覆盖率可视化仪表盘集成VSCode自动化测试运行器与覆盖率可视化仪表盘

    配置 Jest 与 VSCode 扩展可实现实时测试和覆盖率可视化。首先安装 Jest 并设置 package.json 脚本为 “test”: “jest –watchAll –coverage”,再安装 “Jest Runn…

    2026年10月20日 • 用户投稿
    300
  • 在Java中如何捕获IllegalArgumentException

    在Java中如何捕获IllegalArgumentException在Java中如何捕获IllegalArgumentException在Java中如何捕获IllegalArgumentException在Java中如何捕获IllegalArgumentException

    使用try-catch捕获IllegalArgumentException可提升程序健壮性,如Integer.parseInt(“abc”)抛出NumberFormatException(其子类)时能被catch块处理;业务中可主动抛出该异常并捕获,如setAge(-5)时提…

    2026年10月20日 • 用户投稿
    100
  • MySQL怎样处理大事务 大事务拆分与性能优化方案

    MySQL怎样处理大事务 大事务拆分与性能优化方案MySQL怎样处理大事务 大事务拆分与性能优化方案MySQL怎样处理大事务 大事务拆分与性能优化方案MySQL怎样处理大事务 大事务拆分与性能优化方案

    避免大事务是mysql处理大事务的首要原则,若无法避免,则需拆解并优化性能。判断大事务的标准包括执行时间长(如几秒以上)、修改数据量大(如数百行以上),以及数据库监控指标异常(如连接数、锁等待时间上升)。其危害包括锁定时间过长、回滚耗时、资源占用高、主从延迟及影响备份恢复。拆分策略包括按功能拆分、按…

    2026年10月20日 • 用户投稿
    000
  • 探探App如何拉黑不良账号_探探App不良账号拉黑方法及后续处理

    探探App如何拉黑不良账号_探探App不良账号拉黑方法及后续处理探探App如何拉黑不良账号_探探App不良账号拉黑方法及后续处理探探App如何拉黑不良账号_探探App不良账号拉黑方法及后续处理探探App如何拉黑不良账号_探探App不良账号拉黑方法及后续处理

    在探探上遇到骚扰可快速拉黑:从消息、关注列表或聊天窗口进入用户主页,点击“⋯”选择“加入黑名单”即可。2. 拉黑后对方无法联系你或查看你的信息,你在其推荐和搜索中消失,互关关系解除。3. 若误拉黑,可进入“设置→隐私与权限→黑名单”解除,解除后对方可重新互动但无通知。4. 遇严重违规还应举报。 在探…

    2026年10月20日 • 用户投稿
    000
  • 在Java中如何使用命令行运行Java程序_Java命令行开发方法分享

    在Java中如何使用命令行运行Java程序_Java命令行开发方法分享在Java中如何使用命令行运行Java程序_Java命令行开发方法分享在Java中如何使用命令行运行Java程序_Java命令行开发方法分享在Java中如何使用命令行运行Java程序_Java命令行开发方法分享

    首先编译Java源文件生成class文件,再通过java命令运行;若含包结构需按目录存放并使用完整类名执行;可传递参数给main方法,并用-cp指定类路径加载外部依赖。 在Java中使用命令行运行程序是开发中的基础技能,尤其适用于学习、调试和轻量级项目。掌握命令行操作能帮助你更深入理解Java编译与…

    2026年10月20日 • 用户投稿
    000
  • 2026年QQ邮箱登录页 2026快速打开QQ邮箱官方网址

    2026年QQ邮箱登录页 2026快速打开QQ邮箱官方网址2026年QQ邮箱登录页 2026快速打开QQ邮箱官方网址2026年QQ邮箱登录页 2026快速打开QQ邮箱官方网址2026年QQ邮箱登录页 2026快速打开QQ邮箱官方网址

    作为中国互联网服务领域的常青树,qq邮箱凭借其稳定可靠的服务、与qq账号体系的无缝集成以及不断创新的功能,早已成为亿万用户处理个人与工作事务的首选电子邮箱。它不仅仅是一个简单的邮件收发工具,更是一个集成了文件中转站、日历、记事本等多种高效办公与生活功能的综合性平台,以其简洁的界面和强大的功能,为用户…

    2026年10月20日 • 用户投稿
    000
  • 天眼查App怎么分享公司名片_天眼查App分享公司名片详细方法

    天眼查App怎么分享公司名片_天眼查App分享公司名片详细方法天眼查App怎么分享公司名片_天眼查App分享公司名片详细方法天眼查App怎么分享公司名片_天眼查App分享公司名片详细方法天眼查App怎么分享公司名片_天眼查App分享公司名片详细方法

    一、通过企业详情页直接分享,点击右上角分享按钮,选择微信、QQ等渠道发送含公司核心信息的卡片;二、复制企业链接并粘贴至聊天工具,便于对方查看完整详情;三、对关键信息截图并标注后,通过社交软件发送,灵活突出重点内容。 如果您在使用天眼查App时,需要将某家公司的信息分享给同事或合作伙伴,可以通过应用内…

    2026年10月20日 • 用户投稿
    000
  • VS Code插件开发:从零构建完整扩展流程

    VS Code插件开发:从零构建完整扩展流程VS Code插件开发:从零构建完整扩展流程VS Code插件开发:从零构建完整扩展流程VS Code插件开发:从零构建完整扩展流程

    答案:掌握VS Code插件开发需经历初始化、编码、调试、打包与发布四步。首先通过Yo Code生成项目结构,推荐使用TypeScript;在extension.ts中注册命令并实现功能逻辑,如弹出消息或监听事件;利用内置调试模式(F5)测试扩展行为;最后安装vsce工具登录账号并发布至市场。整个流…

    2026年10月20日 • 用户投稿
    100
  • ChatGPT国内可以使用吗?ChatGPT国内使用方法

    ChatGPT国内可以使用吗?ChatGPT国内使用方法ChatGPT国内可以使用吗?ChatGPT国内使用方法ChatGPT国内可以使用吗?ChatGPT国内使用方法ChatGPT国内可以使用吗?ChatGPT国内使用方法

    ChatGPT是一款由OpenAI开发的强大语言模型,因其出色的文本生成、翻译和代码编写能力而广受关注。虽然ChatGPT在国外已广泛应用,但目前它在国内的使用情况仍受限。由于政策法规限制,ChatGPT尚未在国内正式推出。国内用户无法通过官方渠道直接访问ChatGPT服务。但是,有部分第三方平台和…

    2026年10月20日 • 用户投稿
    100
  • 马斯克官宣全新Grok 4模型 将于7月4日后正式发布

    马斯克官宣全新Grok 4模型 将于7月4日后正式发布马斯克官宣全新Grok 4模型 将于7月4日后正式发布马斯克官宣全新Grok 4模型 将于7月4日后正式发布马斯克官宣全新Grok 4模型 将于7月4日后正式发布

    此前马斯克曾在社交平台透露,计划使用新一代大模型重构人类知识体系,补充缺失信息,修正错误内容,并以此“净化版”知识库为基础重新训练模型。从目前的进展来看,这款全新大模型的发布可能已经临近。 Grok 4将在7月4日之后正式推出 美东时间6月27日,马斯克在其海外社交账号上表示,新版大模型的研发进展良…

    2026年10月20日 • 用户投稿
    100
  • Java中如何通过ConcurrentSkipListMap实现有序并发Map

    Java中如何通过ConcurrentSkipListMap实现有序并发MapJava中如何通过ConcurrentSkipListMap实现有序并发MapJava中如何通过ConcurrentSkipListMap实现有序并发MapJava中如何通过ConcurrentSkipListMap实现有序并发Map

    ConcurrentSkipListMap是Java中基于跳跃表实现的线程安全有序Map,支持高并发下O(log n)时间复杂度的插入、删除和查找操作,1. 它实现了SortedMap和ConcurrentMap接口,2. 默认按自然顺序排序键,也可通过Comparator自定义排序规则,3. 遍历…

    2026年10月20日 • 用户投稿
    100
  • 天眼查app怎么查企业邮箱_天眼查企业邮箱查询方法

    天眼查app怎么查企业邮箱_天眼查企业邮箱查询方法天眼查app怎么查企业邮箱_天眼查企业邮箱查询方法天眼查app怎么查企业邮箱_天眼查企业邮箱查询方法天眼查app怎么查企业邮箱_天眼查企业邮箱查询方法

    答案是通过天眼查App查询企业邮箱。首先在App中搜索目标企业并进入详情页,查看“联系方式”或“企业信息”栏目是否登记了电子邮件;其次可点击官网或微信公众号等链接,在“联系我们”页面查找公开邮箱;最后通过“主要人员”获取高管姓名,结合公司域名推测邮箱格式(如姓名全拼@公司域名.com),并用验证工具…

    2026年10月20日 • 用户投稿
    200
  • 使用VSCode的Snippets创建自定义代码片段

    在VSCode中创建自定义代码片段可大幅提升编码效率,通过设置全局或语言级JSON模板,用prefix触发包含占位符的代码块,支持变量与多光标同步,保存后即生效。 在vscode中,代码片段(snippets)能大幅提升编码效率。通过定义常用代码模板,你可以用简短的触发词快速生成结构化代码。下面是如…

    2026年10月20日
    100
  • LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法

    LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法

    tcpdump是Linux下强大的命令行抓包工具,可用于分析网络通信问题。首先通过sudo apt install tcpdump安装,使用tcpdump -i any -D查看可用接口。基本抓包命令为sudo tcpdump -i eth0,可实时显示数据包信息,按Ctrl+C停止并生成统计。为避…

    2026年10月20日 • 用户投稿
    100
  • ChatGPT香港怎么注册?ChatGPT注册安装使用教程

    ChatGPT香港怎么注册?ChatGPT注册安装使用教程ChatGPT香港怎么注册?ChatGPT注册安装使用教程ChatGPT香港怎么注册?ChatGPT注册安装使用教程ChatGPT香港怎么注册?ChatGPT注册安装使用教程

    文章首段摘要本文将提供一个详细指南,指导用户如何在香港成功注册和使用 ChatGPT。虽然 ChatGPT 目前仅对美国用户开放,但本文将介绍一种简单的方法,使用 专属网络 或 Google Voice 绕过地理限制。此外,本文还将提供逐步指导,从下载应用程序到设置个人资料,再到使用 ChatGPT…

    2026年10月20日 • 用户投稿
    200
  • 在Java中如何使用UUID生成唯一标识符_UUID使用技巧指南

    在Java中如何使用UUID生成唯一标识符_UUID使用技巧指南在Java中如何使用UUID生成唯一标识符_UUID使用技巧指南在Java中如何使用UUID生成唯一标识符_UUID使用技巧指南在Java中如何使用UUID生成唯一标识符_UUID使用技巧指南

    答案:Java中UUID通过randomUUID()生成唯一标识,适用于分布式系统。可解析字符串、比较排序,建议存储用BINARY(16)、避免自定义算法,线程安全,常用于主键、会话ID等场景。 在Java中,UUID(Universally Unique Identifier)是一种用于生成全局唯…

    2026年10月20日 • 用户投稿
    000
  • ChatGPT哪些国家可以使用?是否需要付费?

    ChatGPT哪些国家可以使用?是否需要付费?ChatGPT哪些国家可以使用?是否需要付费?ChatGPT哪些国家可以使用?是否需要付费?ChatGPT哪些国家可以使用?是否需要付费?

    针对ChatGPT的使用情况,本篇文章将重点探讨其可访问性以及是否需要付费。文章将详细阐述ChatGPT目前可在哪些国家和地区使用,以及在不同的国家和地区,使用ChatGPT是否需要支付费用。通过深入分析,读者将全面了解ChatGPT的可用性和其收费政策。 ☞☞☞AI 智能聊天, 问答助手, AI …

    2026年10月20日 • 用户投稿
    100
  • windows10如何解决“应用程序无法正常启动(0xc000007b)”错误_windows10程序启动错误修复方法

    windows10如何解决“应用程序无法正常启动(0xc000007b)”错误_windows10程序启动错误修复方法windows10如何解决“应用程序无法正常启动(0xc000007b)”错误_windows10程序启动错误修复方法windows10如何解决“应用程序无法正常启动(0xc000007b)”错误_windows10程序启动错误修复方法windows10如何解决“应用程序无法正常启动(0xc000007b)”错误_windows10程序启动错误修复方法

    0xc000007b错误多因运行库缺失或系统文件损坏,可先用sfc /scannow命令修复系统文件,再重装Visual C++和DirectX运行库,并确认应用与系统架构匹配。 如果您尝试在Windows 10上启动某个应用程序或游戏时,弹出“应用程序无法正常启动(0xc000007b)”的错误提…

    2026年10月20日 • 用户投稿
    100
  • 在VSCode中配置Rust开发环境

    在VSCode中配置Rust开发环境在VSCode中配置Rust开发环境在VSCode中配置Rust开发环境在VSCode中配置Rust开发环境

    首先安装Rust工具链并配置VSCode插件。Windows用户下载rustup-init.exe,macOS/Linux用户用curl命令安装,完成后验证rustc和cargo版本;接着在VSCode中安装Rust Analyzer、CodeLLDB等插件;然后用cargo new创建项目,在VS…

    2026年10月20日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信