目录

图解游戏规则

案例说明

比较CountDownLatch

总结


图解游戏规则


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

现在有运动员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 {@Overridepublic 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运动员接力赛相关推荐

  1. java.util.concurrent包(6)——CyclicBarrier使用

    CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待, ...

  2. CyclicBarrier 使用核心原理 图解

    疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...

  3. java.util.concurrent.CyclicBarrier;

    2019独角兽企业重金招聘Python工程师标准>>> 每个线程代表一个赛跑运动员,当所有的赛跑运动员都准备好了,才一起出发,只要有一个没有准备好,大家都要等待着. package ...

  4. countDownLatch 与 CyclicBarrier 区别

    2019独角兽企业重金招聘Python工程师标准>>> 我自己的理解: 假如有8个运动员和一个教练. countDownLatch : 每个运动员跑完了通知了教练自己就可以做其他事情 ...

  5. JAVA所有选手就位后比赛开始_Java多线程-CountDownLatch、CyclicBarrier、Semaphore

    上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...

  6. J.U.C系列(二)CyclicBarrier的使用

    CyclicBarrier 用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行. 和 CountdownLatch 相似,都是通过维护计数器来实现的.线程执行 await() 方法 ...

  7. java的CyclicBarrier使用

    假设有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待. public class UseCyclicBarrier {static class ...

  8. 洛谷 【P1252】马拉松接力赛

    洛谷 [P1252]马拉松接力赛 题目描述 某城市冬季举办环城25km马拉松接力赛,每个代表队有5人参加比赛,比赛要求每个的每名参赛选手只能跑一次,一次至少跑1km.最多只能跑10km,而且每个选手所 ...

  9. Java11-day02【多态(成员访问、多态转型、内存图解)、抽象类(成员特点)、接口(成员特点)、类和接口的关系、抽象类和接口的区别、综合案例】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

最新文章

  1. 『假如我是面试官』RabbitMQ我会这样问!
  2. 消息中间件的意义和应用场景 (activeMq)
  3. AR凭什么成为元宇宙和现实间的技术纽带?听听业内怎么说|量子位· 对撞派...
  4. Selenium+PhantomJS使用时报错原因及解决方案
  5. react native 的赋值比较,空字符串以及undefined
  6. 文本编辑器实现光标定位的功能
  7. Hadoop应用实战100讲(二)-Hadoop常用命令汇总
  8. 一个想法不一定对 系列
  9. 让我们用jOOλ在Java 8中流式传输地图
  10. vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
  11. linux系统grep用法,Linux系统中怎么使用grep命令?
  12. java 内存管理 知乎_[知乎]Java 语言的 GC 为什么不实时释放内存?
  13. Nignx的修改弱密码套件
  14. 【华为校招】【校招】【Java】叠积木
  15. 计算机网络的组成与分类
  16. infer的用法_infer使用的浅谈简析
  17. 考研高等数学公式总结(一)
  18. YoloV4当中的Mosaic数据增强方法(附代码讲解)
  19. CSS复合选择器,元素的显示模式,CSS背景设置
  20. unity添加天空盒的两种方式

热门文章

  1. MySQL中DQL查询数据——(四)
  2. 一文搞懂什么是“退化维度”
  3. 逐浪软件智图->全网发布∞面向企业级的智能图库
  4. C# •MouseDown •MouseDown •MouseUp 的先后顺序
  5. Eclipse(STS) organize import 不能自动导入引用类
  6. AngularJS 实践:应用开发 :: ENA13 价格条码-(三)
  7. mysql日期函数使用案列_MySQL中curdate()函数的代码案例
  8. html横线滑动代码,html 横线的代码 - osc_5dluvsgf的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. curl post参数问题
  10. STL用法(转自吉吉)