图解CyclicBarrier运动员接力赛
图解游戏规则
大家都知道运动员短跑接力赛,今天我们并不是讲接力赛,我们讲“接力协作赛”,需要我们重新定义下游戏规则:如下图所示

现在有运动员A,B,先定义游戏规则:赛道目前是300米,每个运动员在跑完第一个100米时,需要等待其他运动员跑完第一个100米,比如运动员A先跑完100米,而此时运动员B只跑了95米,那运动员A必须要等待运动员B跑完剩余的5米,然后再一起接着跑第2个100米,第三个100米,规则也和第1个100米类同,最后我们可以得出一个结论,两个运动员跑完300米赛道,最长需要花多少时间。【本案例纯属虚构,为了讲清楚CyclicBarrier】。下面我们用代码模拟执行。
案例说明
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @author :jiaolian
* @date :Created in 2021-03-01 14:56
* @description:回环屏障测试--接力赛
* @modified By:
* 公众号:叫练
*/
public class CyclicBarrierTest { private static final int THREAD_COUNT = 2;
private static CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{
System.out.println(Thread.currentThread().getName()+"冲破屏障");
});
private static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT); public static void main(String[] args) {
Runnable myTask = new MyTask();
//初始化两个运动员
for (int i=0 ;i<THREAD_COUNT; i++) {
executorService.submit(myTask);
}
} private static class MyTask implements Runnable {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"第1个100米");
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName()+"第2个100米");
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName()+"第3个100米");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
如上代码:线程池模拟执行两个运动员,每个运动员执行完每个100米必须等待另一个运动员,执行结果和我们设想一致,如下图所示。其中pool-1-thread-1,pool-1-thread-2分别表示运动员A,运动员B。CyclicBarrier初始化参数中有一个Runnable是用来冲破屏障回调的函数。

比较CountDownLatch
CyclicBarrier中文释义“回环屏障”,每个线程调用await,计数器会减1,如果此时计数器不为0,线程会阻塞,如果计数器为0说明需要冲破屏障,会唤醒之前被阻塞的线程,并会重置计数器。源码实现中用到了独占锁和条件队列控制线程的进队和出队,CountDownLatch用到的是共享锁,虽然实现不一样,底层都是AQS,相对于CountDownLatch来说,CyclicBarrier是它的补充,功能更强大。
总结
今天我们介绍了CyclicBarrier,整理出来希望能对你有帮助,写的比不全,同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路,我是【叫练】公众号,微信号【jiaolian123abc】边叫边练。
图解CyclicBarrier运动员接力赛的更多相关文章
- CountDownLatch和CyclicBarrier和Semaphore最通俗形象解释
应该还有好多同学对这三个的区别比较模糊,网络上其他文章说的也比较专业化.所以我在这里举个例子说明这三个的区别. 我们假定有一场百米比赛,比赛包括十个运动员和一个裁判,每个运动员和每个裁判都是一个线程, ...
- Java并发编程 (七) J.U.C之AQS
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一. J.U.C之AQS-介绍 1.定义: AbstractQueuedSynchronizer简称AQ ...
- CyclicBarrier 原理(秒懂)
疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...
- 架构师养成记--12.Concurrent工具类CyclicBarrier和CountDownLatch
java.util.concurrent.CyclicBarrier 一组线程共同等待,直到达到一个公共屏障点. 举个栗子,百米赛跑中,所有运动员都要等其他运动员都准备好后才能一起跑(假如没有发令员) ...
- CyclicBarrier、CountDownLatch与Semaphore的小记
CyclicBarrier: 适合的业务场景,比如 1).,现有一大任务,需要得到全年的统计数据的,这个工作量是巨大的,那么可以将其分割为12个月的子任务,各个子任务相互独立,当所有子任务完成了,则就 ...
- Java多线程——其他工具类CyclicBarrier、CountDownLatch和Exchange
CyclicBarrier 适用于:创建一组任务,它们并行地执行任务,然后在进行下一个步骤之前等待,直至所有任务完成.它使得所有的并行任务都将在栅栏处列队,因此可以一致地向前移动. 表示大家彼此等待, ...
- Java并发编程:Semaphore、CountDownLatch、CyclicBarrier
首先我们来实现一个功能:当我们启动一个系统的时候需要初始化许多数据,这时候我们可能需要启动很多线程来进行数据的初始化,只有这些系统初始化结束之后才能够启动系统.其实在Java的类库中已经提供了Sema ...
- CountDownLatch和CyclicBarrier 特点比较
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp79 并发编程中的CountDownLatch和CyclicBarri ...
- Java并发系列[8]----CyclicBarrier源码分析
现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始.例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始.在JUC包中为我们 ...
随机推荐
- leetcode常见问题
开学了 开始每日刷leetcode了 ,开一个新分类记录做题过程和心得. 1.出现本地调试无问题但提交后报错时,很有可能是全局变量导致的,解决办法 (1).尽量写成局部变量,函数尽量传参进入. (2 ...
- [OpenCV]获取摄像头视频
环境:Windows 8 64bit + VS2012 X64 + OpenCV 2.4.7 摄像头的捕捉使用VideoCapture类 Class VideoCapture [OpenCV文档 ...
- HihoCoder-1870 Jin Yong’s Wukong Ranking List(并查集)
我发现大佬好像都是用拓扑排序写的(本菜鸡不会拓扑哭唧唧 说一下并查集的做法吧... 就是找两人右边的(辣鸡的那个人)那个是否比左边厉害,厉害的话就矛盾. 如果他俩没比较过就把厉害的并到辣鸡的. (辣鸡 ...
- PowerShell随笔6---ISE
简单的命令可以通过控制台窗口输入执行,但是我的脚本逻辑复杂,需要保存.总不能在命令行工具中执行吧. 关了窗口,啥都没了.有没有一个IDE,有. 在PowerShell命令行窗口中输入:ISE,就会打开 ...
- SpringCloud @RefreshScope标注的Bean在生命周期中怎么样的?
@RefreshScope 前言 该文章是由上一篇引申而来的,上一篇文章描述了Nacos是怎么触发配置刷新的,接着来写有关@RefreshScope的一些东西,都是由DEBUG而来 上一篇 文章概览 ...
- Linux POSIX共享内存方法&ipcs &struct shmid_ds
内容是主进程创建子进程计算斐波那契数列. 其中计算到第几项是有主进程命令行输入. 共享内存段,并且查看了一些信息. 参考操作系统概念第七版 3.10,3.11 关于LINUX C库函数 中的 fpri ...
- kmp--考研写法
首先是模式串匹配: #include<iostream> #include<stdlib.h> using namespace std; #define maxn 100000 ...
- 015.NET5_MVC_Razor局部视图
局部视图 1. 可以增加代码的重用性 如何定义? 1.添加一cshtml文件 2. 在页面中调用局部视图:@html.Partial("局部视图的名称") 问题:局部视图中不能访问 ...
- 009.NET5_程序的发布运行
发布 相差了web.config文件 脚本启动 cmd,进入程序根目录. 带参启动 其实,最终与web.config中效果一样
- CSS Grid Layout In Action
CSS Grid Layout In Action CSS 异形网格布局实战 refs https://static-nginx-online.fbcontent.cn/tutor/tutor-ybc ...