循环栅栏:CyclicBarrier

CyclicBarrier可以理解为循环栅栏,栅栏就是一种障碍物,
比如通常在私人宅院的周围就可以围上一圈栅栏,阻止闲杂人等入内。
这里当然就是用来阻止线程继续执行,要求线程在栅栏外等待。
前面的Cyclic意为循环,也就是说这个计数器可以反复使用。
比如,我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,
接着凑齐下一批10个线程,这就是循环栅栏内在的含义。

CyclicBarrier的使用场景也很丰富。比如,司令下达命令,要求10个士兵一起去
完成一项任务。这时就会要求10个士兵集合报到,接着,一起雄赳赳,气昂昂地去执行任务。
当10个士兵把自己手上的任务都执行完成了,那么司令才对外宣布,任务完成。

CyclicBarrier比CountDownLatch稍微强大一些,
它可以接收一个参数作为barrierAction.
所谓barrierAction就是当计数器一次计数完成后,
系统会执行的动作。
其中parties表示计数总数,也就是参与的线程总数。

public class CyclicBarrierDemo {public static class Sodier implements Runnable{private String soldier;private final CyclicBarrier cyclic;Sodier(CyclicBarrier cyclic,String soldierName){this.cyclic = cyclic;this.soldier = soldierName;}public void run() {try{cyclic.await();doWork();cyclic.await();} catch (InterruptedException e){e.printStackTrace();} catch (BrokenBarrierException e){e.printStackTrace();}}void doWork(){try {Thread.sleep(Math.abs(new Random().nextInt()%10000));} catch (InterruptedException e){e.printStackTrace();}System.out.println(soldier+":任务完成");}}public static class BarrierRun implements Runnable{boolean flag;int N;public BarrierRun(boolean flag,int N){this.N = N;this.flag = flag;}public void run() {if(flag){System.out.println("司令:[士兵"+ N +"个,任务完成!]");} else{System.out.println("司令:[士兵"+ N +"个,集合完毕!]");flag = true;}}}public static void main(String[] args) throws InterruptedException{final int N = 10;Thread[] allSoldier = new Thread[N];boolean flag = false;CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(flag,N));System.out.println("集合队伍!");for (int i =0;i< N; ++i){System.out.println("士兵"+i+"报道!");allSoldier[i] = new Thread(new Sodier(cyclic,"士兵"+i));allSoldier[i].start();}}
}

创建CyclicBarrier实例,并将计数器设置为10,要求在计数器到达指标时,
执行run()方法。每个士兵线程都会执行run方法。
在第18行cyclic.await()每个士兵都会等待,直到所有的士兵都集合完毕。
集合完毕意味着CyclicBarrier的一次计数完成,当再一次调用CyclicBarrier.await
方法时,会进行下一次计数。doWork();模拟了士兵的任务。
当一个士兵任务执行完,他就会要求CylicBarrier开始下一次计数,
这次计数主要目的是监控是否所有的士兵都已经完成了任务。
一旦任务全部完成。

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

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

相关文章

模拟信号和数字信号的区别

模拟和数字信号是携带信息的信号类型。两种信号之间的主要区别在于模拟信号具有连续电信号&#xff0c;而数字信号具有非连续电信号。 模拟信号和数字信号之间的差异可以通过不同类型波的例子来观察。 什么是模拟信号(Analog Signals)&#xff1f; 许多系统使用模拟信号来传输…

Java中四种引用类型(强、软、弱、虚)

目录 引言 强引用&#xff08;Strong References&#xff09; 软引用&#xff08;Soft References&#xff09; 弱引用&#xff08;Weak References&#xff09; 虚引用&#xff08;Phantom References&#xff09; 引用类型的应用场景 总结 引言 Java中的引用类型是管理…

LVS负载均衡集群之HA高可用模式

Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 一个合格的集群应该具备的特性&#xff1a; 1.负载均衡 LVS Nginx HAProxy F5 2.健康检查&#xff08;探针&#xff09; for调度器/节点服务器 Keeplived Hearbeat 3.故障转移 通过VIP飘逸实现主备切换 健康检查&am…

Python数据加密:保障信息安全的最佳实践

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 随着信息技术的发展&#xff0c;数据安全成为越来越重要的议题。在Python中&#xff0c;有多种方法可以用于数据加密&#xff0c;以确保敏感信息在传输和存储过程中不被泄露或篡改。本文将详细介绍Python中数据加…

数据可视化---直方图

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

基于SpringBoot+Vue的小区物业管理系统

基于SpringBootVue的小区物业管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 房屋类型 论坛 登录界面 管理员界面 员工界面 摘要 小区物业管理系统是一个…

202349读书笔记|《陈年喜的诗》——杏花岁岁结出青杏 岁月是永恒的 善变的是人类的命运

《陈年喜的诗》作者矿工诗人陈年喜&#xff0c;今年还读了一本外卖诗人的《赶时间的人》&#xff0c;也很惊喜。脚下是泥泞的土地&#xff0c;心中是灿烂的繁星。我喜欢生活与生命的厚重烙刻在他们心灵的痕迹&#xff0c;有心酸艰苦&#xff0c;但更多的是对生活的热爱&#xf…

智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.…

内外联动——记建行江门鹤山支行营业部成功堵截诈骗

“谢谢&#xff0c;太谢谢你们了&#xff01;真没想到&#xff0c;现在骗子手段这么高了&#xff0c;冒充我孙儿太像了。要不是你们一直拦着我&#xff0c;差点就把养老钱汇出去了&#xff01;”近日&#xff0c;在建行江门鹤山支行营业部大厅里&#xff0c;一位老人家肖婆婆对…

第二百一十七回 修改页面导航中遇到的问题

文章目录 1. 问题介绍2. 使用方法3. 代码与分析3.1 示例代码3.2 代码分析4. 内容总结我们在上一章回中介绍了"分享一种更新页面数据的方法"相关的内容,本章回中将介绍修改页面导航中遇到的问题.闲话休提,让我们一起Talk Flutter吧。 1. 问题介绍 我们在页面之间导…

Jackson 注解及配置大全

Jackson JSON 框架中包含了大量的注解来让我们可以干预 Jackson 的 JSON 处理过程&#xff0c; 例如我们可以通过注解指定 java pojo 的某些属性在生成 json 时被忽略。。本文主要介绍如何使用 Jackson 提供的注解。 Jackson注解主要分成三类&#xff0c;一是只在序列化时生效的…

远程多窗口和Screen用法

Termius 远程链接服务器终端时&#xff0c;经常遇到需要开多个窗口&#xff0c;另外还可能涉及到正在运行的程序一旦和服务器链接断开&#xff0c;那么程序也就停止执行了。对于单单只需要多个窗口的问题&#xff0c;建议下载一个Termius这样软件&#xff0c;比多次打开…