CountDownLatch应用举例

定义

CountDownLatch是juc下的一个多线程锁,下面是jdk对它的定义

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

翻译如下

一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

可以简单地理解为倒计次数锁,只有计数为零时,才能执行之后的代码

关键api

  1. 构造方法
public CountDownLatch(int count)
  1. 倒计数。每执行一次这个方法,计数就减少一次
public void countDown()
  1. 等待。阻塞方法,如果倒计次数没有清空,则会一直阻塞,后面的代码则无法执行
public void await() throws InterruptedException
public boolean await(long timeout, TimeUnit unit)throws InterruptedException
  1. 获取当前计数
public long getCount()

应用场景

有一个物业经理,派出手下11个员工去收取物业费,每个员工收费结束交给经理,经理计算手中的总额,大于等于100元,则把交给上级。最后的员工到达后,不论多少,经理都将手中的钱交给上级

EMPLOYEE_COUNT :员工数量
totalAmount :经理手中的金额
THRESHOLD_AMOUNT:门槛金额,当到达门槛金额时,要执行上交操作,totalAmount 清零
feeQueue :使用BlockingQueue阻塞队列用于存放收取的物业费

代码如下

private static final int EMPLOYEE_COUNT = 11;
private static final int THRESHOLD_AMOUNT = 100;
private static BlockingQueue<Integer> feeQueue = new ArrayBlockingQueue<>(EMPLOYEE_COUNT);
private static int totalAmount = 0;public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(EMPLOYEE_COUNT + 1);CountDownLatch countDownLatch = new CountDownLatch(EMPLOYEE_COUNT);// 启动经理线程executorService.execute(() -> {try {while (countDownLatch.getCount() > 0 || !feeQueue.isEmpty()) {Integer amount = feeQueue.poll();if (amount != null) {totalAmount += amount;System.out.println("经理收到了 " + amount + " 元,总金额:" + totalAmount);if (totalAmount >= THRESHOLD_AMOUNT) {System.out.println("经理将 " + totalAmount + " 元交给上级");totalAmount = 0;}}}} catch (Exception e) {Thread.currentThread().interrupt();}});// 启动员工线程for (int i = 1; i <= EMPLOYEE_COUNT; i++) {final int employeeId = i;executorService.execute(() -> {int amount = (int) (Math.random() * 100) + 1; // 模拟收取随机金额System.out.println("员工 " + employeeId + " 收取了 " + amount + " 元");try {feeQueue.put(amount);} catch (InterruptedException e) {Thread.currentThread().interrupt();}countDownLatch.countDown();});}// 关闭线程池executorService.shutdown();try {countDownLatch.await(); // 等待所有员工线程完成} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 最后处理剩余金额if (totalAmount > 0) {System.out.println("最后的员工到达后,经理将剩余的 " + totalAmount + " 元交给上级");}
}

输出结果如下
可以看到经理每收取100元就上交一次,最后的员工到达后,经理将剩余的钱上交了,符合预期

员工 5 收取了 45 元
员工 9 收取了 47 元
员工 11 收取了 24 元
员工 4 收取了 56 元
员工 3 收取了 68 元
员工 7 收取了 11 元
员工 1 收取了 99 元
员工 8 收取了 76 元
员工 10 收取了 30 元
员工 2 收取了 10 元
员工 6 收取了 39 元
最后的员工到达后,经理将剩余的 47 元交给上级
经理收到了 47 元,总金额:47
经理收到了 68 元,总金额:115
经理将 115 元交给上级
经理收到了 45 元,总金额:45
经理收到了 11 元,总金额:56
经理收到了 24 元,总金额:80
经理收到了 99 元,总金额:179
经理将 179 元交给上级
经理收到了 56 元,总金额:56
经理收到了 76 元,总金额:132
经理将 132 元交给上级
经理收到了 30 元,总金额:30
经理收到了 10 元,总金额:40
经理收到了 39 元,总金额:79

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADC(二):外部触发

有关ADC的基础知识请参考标准库入门教程 ADC&#xff08;二&#xff09;&#xff1a;外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…

几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks

几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost&#xff1a;(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…

【连续学习之SSL算法】2018年论文Selfless sequential learning

1 介绍 年份&#xff1a;2018 期刊&#xff1a; arXiv preprint Aljundi R, Rohrbach M, Tuytelaars T. Selfless sequential learning[J]. arXiv preprint arXiv:1806.05421, 2018. 本文提出了一种名为SLNID&#xff08;Sparse coding through Local Neural Inhibition and…

结构方程模型【SEM】:嵌套分层数据及数据分组分析

结构方程模型&#xff08;System of Equations Model&#xff0c;简称SEM&#xff09;&#xff0c;在生态学和环境科学中通常指的是一组描述生态系统中能量、物质和信息流动的数学方程。这些方程可以是确定性的&#xff0c;也可以是随机的&#xff0c;它们共同构成了一个模型&a…

hot100_56. 合并区间

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。 请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。数据结构 二维链表存储每个区间 方法 先对每个区间的…

Python大数据:基于Python的王者荣耀战队数据分析系统的设计与实现

系统展示 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与MYSQL技术搭建了一个王者荣耀战队的数据分析系统。对用户提出的功能进行合理分析&#xff0c;然后搭建开发平台以及配置计算机软硬件&#xff1b;通过对数据流图以及系统结构的设计&#xff0c;创建相应的数据…

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了

day26 文件io

函数接口 1 .open和close 文件描述符&#xff1a;系统为用open打开的文件分配的标识符 非负的整形数据 0-1023 最小未被使用原则 使用完时及时释放&#xff0c;避免文件描述符溢出 文件描述溢出就是文件使用完没有及时关闭文件 int open(const char *pathname, int flags); /…

Java Stream流详解——串行版

Stream流——串行版 ​ Stream流是java8引入的特性&#xff0c;极大的方便了我们对于程序内数据的操作&#xff0c;提高了性能。通过函数式编程解决复杂问题。 1.BaseStream<T,S extense BaseStream<T,S>> ​ 他是流处理的基石概念&#xff0c;重点不在于这个接…

el-backtop(返回顶部)

案例&#xff1a; <el-backtop target".app-main"><svg-icon icon-class"backtop" size"24px" /></el-backtop>

探秘“香水的 ChatGPT”:AI 开启嗅觉奇幻之旅!

你没有看错&#xff0c;AI也能闻到味道了&#xff01;这是一家名为Osmo公司公布的信息&#xff0c;他们成功创造出了由AI生成的李子味道&#xff0c;快跟着小编一探究竟吧~ 【图片来源于网络&#xff0c;侵删】 Osmo公司的这项技术&#xff0c;通过分析香味的化学成分和人类嗅…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天&#xff0c;电子配件行业作为科技创新的前沿阵地&#xff0c;正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备&#xff0c;各种新型电子配件层出不穷&#xff0c;极大地丰富了人们的生活。然而&#xff0c;随着产品种类的增多和功能的复杂化…

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…

对外发PDF设置打开次数

在线 Host PDF 文件并对链接进行限制——保障文件安全的最佳解决方案 在数字化办公和远程协作日益普及的今天&#xff0c;如何安全高效地分享 PDF 文件成为许多用户关注的重点。MaiPDF 作为一款功能强大的在线工具&#xff0c;不仅支持在线 host PDF 文件&#xff0c;还提供多…

VS2022 中的 /MT /MTd /MD /MDd 选项

我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…

MacOS下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具&#xff0c; 下面介绍MacOS私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业&#xff0c;支持在本地或专属服务器上运行&#xff0c;以实现对数据和系统的完全控制。 1、Mac 服务端安装 Mac安装包下载地址&a…

Amazon Bedrock 实践 - 利用 Llama 3.2 模型分析全球糖尿病趋势

黄浩文 资深开发者布道师 亚马逊云科技 拥有电信、互联网以及云计算等行业超过 20 年的丰富经验&#xff0c;曾任职于微软、Sun 和中国电信。他目前专注于生成式 AI、大型语言模型 (LLM)、机器学习和数据科学等领域的技术内容创作和实践分享&#xff0c;致力于赋能全球开发者。…

期权懂|如何计算期权卖方平仓后的盈利?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何计算期权卖方平仓后的盈利&#xff1f; 期权卖方平仓后的盈利计算涉及多个因素&#xff0c;包括期权的交易价格、平仓价格以及权利金的变动等。 交易价格&#xff1a;期权卖…

【连续学习之VCL算法】2017年论文:Variational continual learning

1 介绍 年份&#xff1a;2017 期刊&#xff1a; arXiv preprint Nguyen C V, Li Y, Bui T D, et al. Variational continual learning[J]. arXiv preprint arXiv:1710.10628, 2017. 本文提出的算法是变分连续学习&#xff08;Variational Continual Learning, VCL&#xf…