前言:CyclicBarrier  ,字面上Cyclic+Barrier --->循环屏障/障碍

这个类所表达的思想和CountDownLauch不一样,CountDownLatch类(见我上篇博客)是一次性的,也就是说如果不更新count,CountDownLatch在保持一次同步后就不会更新同步了  而CyclicBarrier是可以循环利用一开始设置的count同步的,这就是Cyclic的由来,线程到达指定的节点后,等待都到全了才会进行下一轮,这个节点就是屏障,障碍。

可以从游戏的角度来理解这个节点为什么叫障碍,一个游戏地图的游戏,需要4个角色都达指定的位置他们才会进入下一个地图,那么这时候,地图上的这个传送节点就可以看成是一个屏障,我们需要等待角色都到达后才能继续前进。

接下来,讲解和案例如下:

源码注释如下

* A synchronization aid that allows a set of threads to all wait for
* each other to reach a common barrier point.  CyclicBarriers are
* useful in programs involving a fixed sized party of threads that
* must occasionally wait for each other. The barrier is called
* <em>cyclic</em> because it can be re-used after the waiting threads
* are released.
*
* <p>A {@code CyclicBarrier} supports an optional {@link Runnable} command
* that is run once per barrier point, after the last thread in the party
* arrives, but before any threads are released.
* This <em>barrier action</em> is useful
* for updating shared-state before any of the parties continue.

从上面可以归纳出几点:

1.CyclicBarriers 可以保持线程之间的同步

2.设置count的值,也就是需要等待同步线程的个数   它可以循环利用,不是一次性的

3.CyclicBarriers 可以有一个Runnable的接口来表示它的动作,这个动作就是把count个线程等待完了,然后执行我们的这个动作,然后再进行下一轮的执行,在源码中   这个动作是  barrierAction

案例如下:

我们有B、C、D、E四个角色,他们必须一次到达1、2、3、4、5.。。。。。。49个节点后才能领取奖励,意味着游戏结束

public class MyTest {static int num = 4;//线程的个数//游戏校色的个数static int nn = 0;//节点的个数static boolean flag= true;public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {@Overridepublic void run() {nn++;if(nn==50){flag = false;System.out.println("游戏结束");}if (nn<50)System.out.println("都到齐了,开始"+"去往第"+nn+"个节点");}});char c = 'A';System.out.println("都到齐了,开始"+"去往第"+nn+"个节点");for(int i = 0;i<num;i++){c = (char)++c;new Thread(new Work(barrier), String.valueOf(c)).start();}}static class Work implements Runnable{final CyclicBarrier barrier;public Work(CyclicBarrier barrier) {this.barrier = barrier;}@Overridepublic void run() {while(flag){System.out.println(Thread.currentThread().getName()+"角色达到了"+"第"+nn+"个节点");
//                System.out.println("barrierIsBroken"+barrier.isBroken());try {// System.out.println(Thread.currentThread().getName()+"等待别人过来");barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}}
}

执行结果如下:(结果太长,之粘贴了部分)

D角色达到了第30个节点
E角色达到了第30个节点
都到齐了,开始去往第31个节点
E角色达到了第31个节点
C角色达到了第31个节点
D角色达到了第31个节点
B角色达到了第31个节点
都到齐了,开始去往第32个节点
B角色达到了第32个节点
D角色达到了第32个节点
C角色达到了第32个节点
E角色达到了第32个节点
都到齐了,开始去往第33个节点
E角色达到了第33个节点
B角色达到了第33个节点
C角色达到了第33个节点
D角色达到了第33个节点
都到齐了,开始去往第34个节点
D角色达到了第34个节点
E角色达到了第34个节点
C角色达到了第34个节点
B角色达到了第34个节点
都到齐了,开始去往第35个节点
B角色达到了第35个节点
D角色达到了第35个节点
C角色达到了第35个节点
E角色达到了第35个节点
都到齐了,开始去往第36个节点
E角色达到了第36个节点
D角色达到了第36个节点
B角色达到了第36个节点
C角色达到了第36个节点
都到齐了,开始去往第37个节点
C角色达到了第37个节点
B角色达到了第37个节点
E角色达到了第37个节点
D角色达到了第37个节点
都到齐了,开始去往第38个节点
D角色达到了第38个节点
E角色达到了第38个节点
B角色达到了第38个节点
C角色达到了第38个节点
都到齐了,开始去往第39个节点
C角色达到了第39个节点
B角色达到了第39个节点
E角色达到了第39个节点
D角色达到了第39个节点
都到齐了,开始去往第40个节点
D角色达到了第40个节点
E角色达到了第40个节点
B角色达到了第40个节点
C角色达到了第40个节点
都到齐了,开始去往第41个节点
C角色达到了第41个节点
B角色达到了第41个节点
E角色达到了第41个节点
D角色达到了第41个节点
都到齐了,开始去往第42个节点
D角色达到了第42个节点
E角色达到了第42个节点
B角色达到了第42个节点
C角色达到了第42个节点
都到齐了,开始去往第43个节点
C角色达到了第43个节点
B角色达到了第43个节点
E角色达到了第43个节点
D角色达到了第43个节点
都到齐了,开始去往第44个节点
D角色达到了第44个节点
C角色达到了第44个节点
E角色达到了第44个节点
B角色达到了第44个节点
都到齐了,开始去往第45个节点
B角色达到了第45个节点
D角色达到了第45个节点
E角色达到了第45个节点
C角色达到了第45个节点
都到齐了,开始去往第46个节点
C角色达到了第46个节点
D角色达到了第46个节点
B角色达到了第46个节点
E角色达到了第46个节点
都到齐了,开始去往第47个节点
C角色达到了第47个节点
E角色达到了第47个节点
B角色达到了第47个节点
D角色达到了第47个节点
都到齐了,开始去往第48个节点
D角色达到了第48个节点
E角色达到了第48个节点
B角色达到了第48个节点
C角色达到了第48个节点
都到齐了,开始去往第49个节点
C角色达到了第49个节点
B角色达到了第49个节点
E角色达到了第49个节点
D角色达到了第49个节点
游戏结束Process finished with exit code 0

并发(多线程)------CyclicBarrier解读与例程相关推荐

  1. JUC并发多线程进阶

    笔记整理来源 B站UP主狂神说Java https://space.bilibili.com/95256449/ JUC并发多线程进阶 1.什么是JUC 源码+官方文档 JUC是 java util ...

  2. java线程知乎_全网独家!知乎20K点赞的Java并发多线程笔记,简直堪称神仙级文档...

    有很多小伙伴都问过我,头条号里的关于java多线程的文章有pdf版本吗?我其实很想弄pdf,但是前段时间一直没时间去折腾,我把每个Java并发编程核心技术的都整理成了一个又一个的文档.昨天也是终于全部 ...

  3. Java 并发/多线程教程(四)-并发模型

    本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 并发系统可以有多 ...

  4. Java 并发/多线程教程(五)-相同线程

    本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 相同线程是一并发框架模型,是一个单线程系统向外扩展成多个单线程的系统.这样的结果就是 ...

  5. Java并发/多线程教程——1

    本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!在早期,计算机只有一个CPU,同一时刻只能执行一个程序,后来有了多任务的说法,多任务是 ...

  6. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  7. java并发多线程面试_Java多线程并发面试问答

    java并发多线程面试 Today we will go through Java Multithreading Interview Questions and Answers. We will al ...

  8. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一) 目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronize ...

  9. 推测的删除锁(Speculative Lock Elision):实现高并发多线程执行

    背景 SLE全称Speculative Lock Elision,我称之为推测的删除锁.这是一篇关于SLE的论文翻译,但是因为本人英语功底很差,所以翻译的不通顺而且会有很多错误的地方.之所以把它发出来 ...

最新文章

  1. LeetCode实战:字符串相加
  2. 只要能坚持下来就是好博客
  3. hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解
  4. c++怎么做app_怎么做一款app
  5. 马云湖畔大学开学致辞:企业家要比谁都相信未来
  6. Atitit 数据查询法 目录 1. 数据查询语言QL (推荐) 1 1.1. Sql 1 1.2. 对象查询语言(OQL) 1 1.3. Atitit QL查询语言总结Jpql Ongl
  7. 2022年中级通信工程师的考试资料,考试延期快快点刷题
  8. vant 个人中心头像修改
  9. 概率论笔记(一)重要公式
  10. 翻转和旋转计算机教学,小学信息技术(上册)第15课图形翻转与旋转教学案例...
  11. 电脑WIFI突然消失解决方法
  12. Java中继承和实现的区别【单继承,多实现】
  13. linux 文件操作write详解
  14. 北大肖臻老师《区块链技术与应用》系列课程学习笔记[3]BTC的具体实现
  15. Elasticsearch文档CURD操作
  16. 回转半径的计算公式_一种计算船舶回转半径的方法
  17. 电子凸轮实现哪些功能
  18. 作为一名优秀程序员的优待是什么?美女鼓励师将是最痛快的福利
  19. 程序员面试谈薪资的6大技巧(转)
  20. window11 无法切换输入法打印不出汉字问题修改

热门文章

  1. 关于“文心一言”,ChatGPT如是说
  2. 星盘软件测试自学,腾讯星座频道_占星知识大讲堂
  3. 读书笔记——《设计心理学2:如何管理复杂》教你应付复杂
  4. dogepool.pw index.php,php – 在Dogecoin转换欧元
  5. 2021年中国PPP项目数量及总投资情况:城市基础设施项目数量最多,贵州项目数量及总投资位全国第一[图]
  6. VMware安装Centos7联网
  7. 熟练使用计算机的意思,熟练使用是什么意思
  8. 安卓模拟器按键_横跨了几代人的经典!PSP模拟器深度教程:模拟器系列008
  9. 上白泽慧音 - C++
  10. 【论文阅读】基于单幅图像的快速去雾