游戏攻略网
当前位置: 首页 游戏攻略

cyclicbarrier源码分解(CyclicBarrier循环栅栏)

时间:2023-07-17 作者: 小编 阅读量: 1 栏目名: 游戏攻略

叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。CyclicBarrier作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且CyclicBarrier功能可重复使用。CyclicBarrier的使用构造方法//parties表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

cyclicbarrier源码分解?CyclicBarrier 字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用,今天小编就来说说关于cyclicbarrier源码分解?下面更多详细答案一起来看看吧!

cyclicbarrier源码分解

简介

CyclicBarrier 字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。

CyclicBarrier 作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且 CyclicBarrier 功能可重复使用。

CyclicBarrier的使用

构造方法

// parties表示屏障拦截的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 我已经到达了屏障,然后当前线程被阻塞。 public CyclicBarrier(int parties) // 用于在线程到达屏障时,优先执行 barrierAction,方便处理更复杂的业务场景(该线程的执行时机是在到达屏障之后再执行)

重要方法

//屏障 指定数量的线程全部调用await()方法时,这些线程不再阻塞// BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时public int await() throws InterruptedException, BrokenBarrierExceptionpublic int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException//循环通过reset()方法可以进行重置

CyclicBarrier 应用场景
  • 利用 CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。
  • 利用 CyclicBarrier的计数器能够重置,屏障可以重复使用的特性,可以支持类似“人满发车”的场景模拟合并计算场景

    利用 CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。

    public class CyclicBarrierTest2 {//保存每个学生的平均成绩private Conc urrentHashMap<String, Integer> map=new ConcurrentHashMap<String,Integer>();private ExecutorService threadPool= Executors.newFixedThreadPool(3);private CyclicBarrier cb=new CyclicBarrier(3,()->{int result=0;Set<String> set = map.keySet();for(String s:set){result =map.get(s);}System.out.println("三人平均成绩为:" (result/3) "分");});public void count(){for(int i=0;i<3;i){threadPool.execute(new Runnable(){@Overridepublic void run() {//获取学生平均成绩int score=(int)(Math.random()*40 60);map.put(Thread.currentThread().getName(), score);System.out.println(Thread.currentThread().getName()"同学的平均成绩为:" score);try {//执行完运行await(),等待所有学生平均成绩都计算完毕cb.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}});}}public static void main(String[] args) {CyclicBarrierTest2 cb=new CyclicBarrierTest2();cb.count();}}

    模拟“人满发车”的场景

    利用CyclicBarrier的计数器能够重置,屏障可以重复使用的特性,可以支持类似“人满发车”的场景

    public class CyclicBarrierTest3 {public static void main(String[] args) {AtomicInteger counter = new AtomicInteger();ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 1000, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100),(r) -> new Thread(r, counter.addAndGet(1)" 号 "),new ThreadPoolExecutor.AbortPolicy());CyclicBarrier cyclicBarrier = new CyclicBarrier(5,() -> System.out.println("裁判:比赛开始~~"));for (int i = 0; i < 10; i) {threadPoolExecutor.submit(new Runner(cyclicBarrier));}}static class Runner extends Thread{private CyclicBarrier cyclicBarrier;public Runner (CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {try {int sleepMills = ThreadLocalRandom.current().nextInt(1000);Thread.sleep(sleepMills);System.out.println(Thread.currentThread().getName()" 选手已就位, 准备共用时: "sleepMills"ms"cyclicBarrier.getNumberWaiting());cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();}catch(BrokenBarrierException e){e.printStackTrace();}}}}

    输出结果:

    3 号选手已就位, 准备共用时: 78ms01 号选手已就位, 准备共用时: 395ms15 号选手已就位, 准备共用时: 733ms22 号选手已就位, 准备共用时: 776ms34 号选手已就位, 准备共用时: 807ms4裁判:比赛开始~~4 号选手已就位, 准备共用时: 131ms03 号选手已就位, 准备共用时: 256ms12 号选手已就位, 准备共用时: 291ms21 号选手已就位, 准备共用时: 588ms35 号选手已就位, 准备共用时: 763ms4裁判:比赛开始~~

    CyclicBarrier 源码分析CyclicBarrier 流程

    主要是的流程:

    1. 获取锁 如果 count != 0 就进入阻塞;
    2. 进入阻塞之前,首先需要进入条件队列,然后释放锁,最后阻塞;
    3. 如果 count != 0 会进行一个唤醒,将所有的条件队列中的节点转换为阻塞队列;
    4. 被唤醒过后会进行锁的获取,如果锁获取失败,会进入 lock 的阻塞队列;
    5. 如果锁获取成功,进行锁的释放,以及唤醒,同步队列中的线程。

    下面是一个简单的流程图:

    下面是具体的一些代码调用的流程。

    几个常见的问题?

    1.一组线程在触发屏障之前互相等待,最后一个线程到达屏障后唤醒逻辑是如何实现的. 唤醒的过程是通过调用 java.util.concurrent.locks.Condition#signalAll唤醒条件队列上的所有节点。

    2.删栏循环使用是如何实现的? 实际上一个互斥锁 ReentrantLock 的条件队列和阻塞队列的转换。

    3.条件队列到同步队列的转换实现逻辑 ? 转换过程中,首先会先将条件队列中所有的阻塞线程唤醒,然后会去获取 lock 如果获取失败,就进入同步队列。

    CyclicBarrier 与 CountDownLatch的区别
    1. CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次
    2. CyclicBarrier还提供getNumberWaiting(可以获得CyclicBarrier阻塞的线程数量)、isBroken(用来知道阻塞的线程是否被中断)等方法。
    3. CountDownLatch会阻塞主线程,CyclicBarrier不会阻塞主线程,只会阻塞子线程。
    4. CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同。CountDownLatch一般用于一个或多个线程,等待其他线程执行完任务后,再执行。CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行。
    5. CyclicBarrier 还可以提供一个 barrierAction,合并多线程计算结果。
    6. CyclicBarrier是通过ReentrantLock的"独占锁"和Conditon来实现一组线程的阻塞唤醒的,而CountDownLatch则是通过AQS的“共享锁”实现
    • 推荐阅读
    • steam棋牌游戏推荐(幸运之夜新版本亮相TGC)

      steam棋牌游戏推荐12月1日,2017腾讯游戏嘉年华正式在成都开幕,腾讯的VR社交游戏《幸运之夜》在现场发布了最新版本。VR《幸运之夜》在TGC2017上惊艳亮相《幸运之夜》新版本发布邀请好友一起游戏今年7月底,《幸运之夜》正式在Steam发布,并推出了首款游戏作品“德州扑克”。今年的TGC2017现场,《幸运之夜》全新版本便带来了对互动性方面的提升。

    • 儿童睡前故事卖火柴的小女孩大全(卖火柴的小女孩)

      在长发公主的故事里,兔子小姐变成了手持宝剑的骑士,穿过了山川和河流,战胜了地狱恶犬,最终救出了长着一头金黄色长发的熊猫先生。随着一阵空间的波动,熊猫先生和兔子小姐来到了冰天雪地的圣诞节。小女孩被这突如其来的变化惊呆了。熊猫先生没有回答,轻轻摸了摸小女孩的头。小女孩点燃了第二根火柴。熊猫先生和兔子小姐则来到壁炉前,商量起小女孩最后一个愿望。熊猫先生蹲下来,握起小女孩的手。

    • 怎样做ppr管快一点(PPR管安装方法及技巧)

      怎样做ppr管快一点PPR管安装方法及技巧首先准备好需要的材料:热熔机,小剪刀,ppr管,管件,手巾。一定要根据自己热熔ppr管的口径,准备相应的热熔头。清洁:清洁管材与管件的焊接段部位,建议用95%浓度酒精擦净。在熔接时间内迅速的将管材无旋转的垂直插入管件中,并维持5秒以上,然后按相应冷却时间冷却。热熔后做到横平竖直,美观大方。

    • 大托特包搭配技巧(大托特包搭配技巧简述)

      西装外套+托特包复古时尚的格子,由黑白交错的条纹形成,文艺而又端庄搭配撞色托特包,优雅而不失俏皮,让气场变得灵动起来内搭白色连帽卫衣,减龄又可爱,接下来我们就来聊聊关于大托特包搭配技巧?大托特包搭配技巧西装外套+托特包复古时尚的格子,由黑白交错的条纹形成,文艺而又端庄。衬衫+托特包白色的衬衫休闲慵懒,给人一种空灵的感觉以及干净纯粹的气质。

    • 刘涛电视剧口碑(电视剧景气指数第一)

      还记得3月份刘涛在和周渝民主演的《大宋宫词》中扮嫩出演少妇被很多观众吐槽。万万没想到时隔数月,刘涛带着她的新剧《星辰大海》杀回来了。目前主要的剧情线在刘涛饰演的女主简爱身上。因为小时候意外发现母亲出轨的事,得知真相的父亲激愤之下杀死母亲并自杀,简爱因此成为了一个孤女。逃出傻子家的简爱在与姑姑的争执中误伤姑姑,从此开启逃命生涯。简爱从面馆辞职走投无路,误打误撞进入大公司之后面临着同事的故意刁难。

    • 外墙装修材料有哪些 外墙装修材料有哪些类型

      外墙涂料具有装饰性良好、耐污染耐老化以及施工维修容易和价格合理的特点。一般来说釉面外墙砖有亚光面与无光面两大类。它的装饰的效果也不错,有柚木色、深灰色等等可供选择。由于它的表面的肌理很清晰,所以色泽漂亮且装饰性极强。本站,中国知名大型装修平台,装修领导品牌。

    • 世界上有哪些花(世界上有哪些花 名字)

      瓜叶菊、香豌豆、夏兰、石竹、石蒜、荷花、翠菊、睡莲、福禄考、晚香玉、万寿菊、千日红、建兰、铃兰、报岁兰、香堇、大岩桐、水仙、小草兰、瓜叶菊、蒲包花、免子花、入腊红、三色堇、百日草、鸡冠花、一串红。孔雀草、大波斯菊、金盏菊、非洲凤仙花、菊花、非洲菊、观赏凤梨类、射干、非洲紫罗兰、天堂鸟、炮竹红、菊花、康乃馨、红掌、满天星、星辰花、三角梅、虞美人。

    • 长歌行李长歌母亲是谁杀的(长歌行李长歌的简介)

      下面更多详细答案一起来看看吧!长歌行李长歌母亲是谁杀的《长歌行》李长歌母亲是自杀的。李长歌,太子李建成之女,生母则是回纥王族。父母手足均死于玄武门之变,满怀愤恨的长歌凭高超武艺逃出皇宫,并在追捕过程中制造“坠崖假死”而逃生,其后女扮男装隐瞒身份流落民间,一心只想为父母复仇,在家和国的利害冲突中,最后放弃复仇,和阿诗勒隼一起成为了民族和解的使者。

    • 什么时候喝蛋白粉增肌效果最好(什么时候喝蛋白粉增肌效果最好)

      从长远来看,这种方法被证明可以促使肌肉明显增长。如果摄入量超过一定的阈值,蛋白质的合成就会受限。如果是以乳清饮料的形式摄入乳清蛋白,运动者可以在运动结束后立即饮用。按每公斤体重1克的标准,在健身前后立即摄入以及在运动后1小时内摄入可快速吸收的碳水化合物,可以明显抑制肌肉分解,并大大促进肌肉快速和明显的增长。在这种情况下,大量分泌的胰岛素促进了氨基酸向工作中的肌肉运输,为蛋白质合成奠定基础。

    • 窦骁周冬雨山楂树之恋结局(周冬雨18岁第一次出演)

      周冬雨18岁第一次出演要说最近最火的电影,非《少年的你》莫属,上映14天,已经收获了12.45亿的票房成绩,成为现阶段最强的票房黑马而作为该片主演的周冬雨和易烊千玺,也凭借在该片中的精彩演出,演技得到大众的进一步认可作为“。