并发编程丨CountDownLatch的使用小demo
发布日期:2022-02-21 17:40:27
浏览次数:35
分类:技术文章
本文共 2465 字,大约阅读时间需要 8 分钟。
1 CountDownLatch 用法
CountDownLatch是java.util.concurrent包中一个类,CountDownLatch只要提供的机制是多个(具体数量等于初始化CountDownLatch时count的值)线程都达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。等待的线程可以是多个,即CountDownLatch可以唤醒多个等待的线程。到达自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。
什么情况下可以用这个cdl呢?我平常约朋友们打英雄联盟(5V5竞技游戏),然后总有那么一个人要在大家都上号了之后他才上号,这个情形就可以使用CDL来表示,废话不说直接上demo!
Player类作为我们提前上号的好队友,因为tx这垃圾服务器的存在,所以上号需要一定时间,这里随机数设置为等待0-10s~
/** * @author :ChenHao86 * @date :Created in 2021/12/31 14:49 * @description: * @modified By: * @version: $ */public class Player implements Runnable { private CountDownLatch downLatch; private String name; public Player(CountDownLatch downLatch, String name) { this.downLatch = downLatch; this.name = name; } public void run() { this.doWork(); try { TimeUnit.SECONDS.sleep(new Random().nextInt(10)); } catch (Exception e) { } System.out.println(this.name + "已经上号了!"); this.downLatch.countDown(); } private void doWork() { System.out.println(this.name + "正在上号!"); }}
BadPlayer作为等大家都上了号以后,才上号那个拖延症坏队友
/** * @author :ChenHao86 * @date :Created in 2021/12/31 14:49 * @description: * @modified By: * @version: $ */public class BadPlayer implements Runnable { private CountDownLatch downLatch; public BadPlayer(CountDownLatch downLatch){ this.downLatch = downLatch; } public void run() { System.out.println("拖延症玩家等其他队友都上号....."); try { this.downLatch.await(); } catch (Exception e) { } System.out.println("其他队友都上号了,他终于上号了~!!"); }}
主方法
/** * @author :ChenHao86 * @date :Created in 2021/12/31 14:50 * @description: * @modified By: * @version: $ */public class CountDownLatchDemo { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS, new ArrayBlockingQueue(16)); CountDownLatch latch = new CountDownLatch(3); Player p1 = new Player(latch, "盖伦"); Player p2 = new Player(latch, "瑞兹"); Player p3 = new Player(latch, "娑娜"); Player p4 = new Player(latch, "赵信"); BadPlayer badPlayer = new BadPlayer(latch); executor.execute(p3); executor.execute(p2); executor.execute(p1); executor.execute(p4); executor.execute(badPlayer); executor.shutdown(); }}
shift+F10执行方法
搞定~转载地址:https://blog.csdn.net/weixin_40597409/article/details/122257107 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年03月25日 16时48分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
系统架构设计笔记(71)—— 信息系统概述
2019-04-26
说说 Canvas 的旋转功能
2019-04-26
说说 Canvas 的缩放功能
2019-04-26
系统架构设计笔记(72)—— 信息系统工程
2019-04-26
系统架构设计笔记(73)—— 政府信息化与电子政务
2019-04-26
系统架构设计笔记(74)—— 企业信息化与电子商务
2019-04-26
系统架构设计笔记(75)—— 知识管理与商业智能
2019-04-26
说说在 log4j 中如何把日志记录到不同的文件中
2019-04-26
说说 jBPM 流程定义语言(3)—— state 活动 (状态活动)
2019-04-26
说说如何安装 Jenkins 2.x
2019-04-26
说说什么是 Android 的碎片(Fragment)
2019-04-26
说说如何使用 Android 的碎片(Fragment)
2019-04-26
说说 Android 碎片 (Fragment) 的生命周期
2019-04-26
运行 Tomcat, 在 Intellij IDEA 控制台输出中文乱码的解决方法
2021-06-29
说说 Android 中动态加载布局的实用技巧
2021-06-29
说说 Android 中如何实现同时兼容手机与平板的新闻应用界面
2021-06-29
说说 Android 的广播机制
2021-06-29
说说在 Android 中如何接收系统广播
2021-06-29