范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

CyclicBarrier循环栅栏

  简介
  CyclicBarrier 字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
  CyclicBarrier 作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且 CyclicBarrier 功能可重复使用。 CyclicBarrier的使用
  构造方法  // parties表示屏障拦截的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 我已经到达了屏障,然后当前线程被阻塞。  public CyclicBarrier(int parties)  // 用于在线程到达屏障时,优先执行 barrierAction,方便处理更复杂的业务场景(该线程的执行时机是在到达屏障之后再执行)
  重要方法 //屏障 指定数量的线程全部调用await()方法时,这些线程不再阻塞 // BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时 public int await() throws InterruptedException, BrokenBarrierException public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException  //循环  通过reset()方法可以进行重置 CyclicBarrier 应用场景利用 CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。 利用 CyclicBarrier的计数器能够重置,屏障可以重复使用的特性,可以支持类似"人满发车"的场景 模拟合并计算场景
  利用 CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。 public class CyclicBarrierTest2 {      //保存每个学生的平均成绩     private Conc urrentHashMap map=new ConcurrentHashMap();      private ExecutorService threadPool= Executors.newFixedThreadPool(3);      private CyclicBarrier cb=new CyclicBarrier(3,()->{         int result=0;         Set 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(){                  @Override                 public 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;         }          @Override         public 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 号  选手已就位, 准备共用时: 78ms0 1 号  选手已就位, 准备共用时: 395ms1 5 号  选手已就位, 准备共用时: 733ms2 2 号  选手已就位, 准备共用时: 776ms3 4 号  选手已就位, 准备共用时: 807ms4 裁判:比赛开始~~ 4 号  选手已就位, 准备共用时: 131ms0 3 号  选手已就位, 准备共用时: 256ms1 2 号  选手已就位, 准备共用时: 291ms2 1 号  选手已就位, 准备共用时: 588ms3 5 号  选手已就位, 准备共用时: 763ms4 裁判:比赛开始~~ CyclicBarrier 源码分析CyclicBarrier 流程
  主要是的流程: 获取锁 如果 count != 0 就进入阻塞; 进入阻塞之前,首先需要进入条件队列,然后释放锁,最后阻塞; 如果 count != 0 会进行一个唤醒,将所有的条件队列中的节点转换为阻塞队列; 被唤醒过后会进行锁的获取,如果锁获取失败,会进入 lock 的阻塞队列; 如果锁获取成功,进行锁的释放,以及唤醒,同步队列中的线程。
  下面是一个简单的流程图:
  下面是具体的一些代码调用的流程。
  几个常见的问题?
  1.一组线程在触发屏障之前互相等待,最后一个线程到达屏障后唤醒逻辑是如何实现的. 唤醒的过程是通过调用  java.util.concurrent.locks.Condition#signalAll  唤醒条件队列上的所有节点。
  2.删栏循环使用是如何实现的? 实际上一个互斥锁 ReentrantLock 的条件队列和阻塞队列的转换。
  3.条件队列到同步队列的转换实现逻辑 ? 转换过程中,首先会先将条件队列中所有的阻塞线程唤醒,然后会去获取 lock 如果获取失败,就进入同步队列。 CyclicBarrier 与 CountDownLatch的区别CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次 CyclicBarrier还提供getNumberWaiting(可以获得CyclicBarrier阻塞的线程数量)、isBroken(用来知道阻塞的线程是否被中断)等方法。 CountDownLatch会阻塞主线程,CyclicBarrier不会阻塞主线程,只会阻塞子线程。 CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同。CountDownLatch一般用于一个或多个线程,等待其他线程执行完任务后,再执行。CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行。 CyclicBarrier 还可以提供一个 barrierAction,合并多线程计算结果。 CyclicBarrier是通过ReentrantLock的"独占锁"和Conditon来实现一组线程的阻塞唤醒的,而CountDownLatch则是通过AQS的"共享锁"实现

睡觉村的乡贤们说午后身体发热要吃菠菜籽!小薛最近晚上总是睡觉不好,甚至还经常,一到下午两三点钟,浑身怕冷,发烧,卡了好几次白大褂,也吃了不少小白片,都不知道自己的身体到底出了什么问题,导致后来问题越来越严重,在好朋友的建眼睛不适,先想到它夏枯草夏枯草具有清热祛暑的功效,民间用它泡茶,作为清凉祛暑剂。现在市面上很多凉茶都加了夏枯草,就是利用它的清热功能,达到祛湿防暑降温的效果。夏枯草可以作为凉茶饮料的原料,也可以作为沙拉汤生物燃料蓬勃发展食用油短缺迫在眉睫智通财经APP获悉,随着生物燃料在全球范围内的蓬勃发展,食用油短缺正变得迫在眉睫。从美国巴西到印度尼西亚,各国政府都在接受从大豆油菜籽等植物甚至是动物脂肪中提取的能源,以摆脱化石燃昆明游玩攻略,必去的8大景点,轻松玩转春城昆明!昆明,一个来了就不想走的城市,非常宜居的城市,有秀丽的山水风光,也有多彩鲜花的浪漫,有文艺清新,也有宁静深远,值得一去再去!旅行就是去不同的城市,沿途遇见的风景和故事,都将成为最深特斯拉普通打工人的天花板,一年轻松10万特斯拉绝对是普通打工人中天花板的存在,并且目前的待遇还是在国内企业家(譬如曹德旺等)的强烈要求下降低的。并且在特斯拉眼中,这已经没法再低的待遇了,国内的工厂是特斯拉全球工厂里面待遇春季已过半,常吃这5种食物,3个好处不请自来,轻松迎夏天三月步入尾声,春分也悄然而过,这也就意味着春季过半,正所谓江南仲春天,细雨色如烟,这个时节,雨水多气温高,许多有害物质滋长,如何增强体质少生病也成为大家都十分关心的问题。而大自然向我爱我家乡一湛江头条创作挑战赛我的家乡一湛江是一个景色优美的城市。位于中国大陆最南端广东省西南部。属于热带北缘季风气候,终年受海洋气候的调节,冬无严寒,夏无酷暑,亚热带作物及海产资源丰富。湛江的景唐山地名由来大揭秘!你肯定想不到你家乡居然这么有故事!这么近那么美周末到河北河北文旅看图识景奋进新时代美丽石家庄你知道唐山得名的原因么?你知道古冶玉田丰润都是怎么来的么?它们有的源于历史,有的源于神话传说,有的源于山川地理环境。你家地六旬龙江摄影家徐林流连家乡光影,极地追拍冰河晶莹剔透的冰凌悬挂在日渐消融的冰层下,折射着橘色的霞光,耳畔是淙淙的流水声眼下,大兴安岭的春意在冰河下涌动,徐林正忙着四处踩点,仔细寻找今年拍摄极地冰河的最佳位置。每年春天和入冬时春天这菜正鲜嫩,揉成面团,包上豆沙馅,大火一蒸超好吃春天有很多时令蔬菜上市,菠菜就是其中一种,新鲜水嫩,正是最好吃的时候。但是很多孩子却不爱吃菠菜,怎么办呢?那就换一种烹饪方式吧,比如切得碎一点烙饼煮面,或者直接揉到面团里,做成各种味蕾上的江苏本土美食志日历八宝葫芦鸭酥皮之下,大有乾坤来源交汇点新闻客户端编者按江苏跨江滨海水网密布土地肥沃物产丰盈,是我国有名的美食大省,八大菜系之一的淮扬菜就诞生于此。千百年来,在这片人文荟萃的土地上,厨师和食客们融合南北烹饪技艺
产煤大省山西,经济三年连超贵州内蒙,除了煤,背后还有哪些因素资源大省山西,近三年经济增长迅猛,一路狂飙。全省GDP从2019年的16962亿元飙升到25643亿元,三年名义增幅高达51。2,增速全国比。GDP连超贵州和内蒙,排名全国第20名自驾游走泰国转战素可泰,探访泰国人的长安城我的宝藏作者位于泰国首都曼谷与有着北方玫瑰之称的清迈之间,有一座总被人忽视的古城素可泰,它在泰国历史上的地位相当于中国的古都长安,既是泰文化的诞生和成长之地,也是泰国第一个真正独立这款洗发水建议脱发人囤!别看名字不起眼,防脱生发功效真的牛!在防脱上我可没少下功夫,每次洗头的时候,水池地板地漏里全都是一网一网的头发,前几年还因为发量少受到了不少嘲笑,所以我才开始防脱养发。在此期间我尝试过各种方法,像侧柏叶洗头生姜擦头皮酒店里面的贵妃椅可以干啥?前台小妹直言,竟还有这些功效对于情侣来说,不仅要在一起,还要在平淡的生活中有一点新鲜感,让感情不断升温。出去玩或者旅游成了生活当中的一种解压方式,对于情侣感情的培养真的非常重要。毕竟只有在旅行中才能发现双方关原神疑是白术卡维相关信息?夜兰胡桃卡池流水情况!哈喽!大家好这里是精灵(开服玩家)精灵会分享关于原神的相关资讯新鲜事!以及关于原神的相关爆料信息,这边会在文章中区分开了那么精灵来分享原神资讯和新鲜事因为家里有点事情,明天和后天都补气血,清燥火,专家教您如何步步为营养好心!双管齐下相辅相成里应外合三个策略,步步为营专家教您如何强心清心护心今年的年运是火运不足,所以最容易受邪气侵袭的脏腑就是心,主要影响心的气血和功能。心主血脉,气血不足时,容易出现神疲2023突破原料封锁!功效护肤成分爆点来袭!要说今年美妆市场上什么成分最火,当属功效护肤成分方向,去年12月疫情封控政策的普遍放开和相关新规的实施,促使产品的安全性溯源步入正轨。随着我国美妆市场消费力的逐步恢复,美妆品牌开始气阴不足会伤阳,两味药泡水喝,补气养阴,滋补肝肾!为什么气阴不足会伤阳?中医认为阴精亏损会累及阳气化生不足,就比如一些肝肾阴虚的朋友最开始是腰膝酸软口干口苦五心烦热。这也不注意,进一步耗伤肾中精气,损及肾阳,现在四肢冰凉还怕冷,晚立春后最怕肺虚和脾虚,每天喝两碗补气润肺健脾,肺气足,胃口好补肺冬春交替之际,乍暖还寒,抵抗力弱的人容易在这个时候感受外邪。此外,春季万物复苏,很多毒邪(传染病病毒)也会在这个时候活跃起来,专家提醒在这个时候,有两个脏腑容易出现气虚,中老年政观察工程院院士岳国君被查,曾是茅台等酒企座上宾岳国君资料图2月17日,中央纪委国家监委网站发布消息称,国投生物科技投资有限公司党委书记董事长岳国君涉嫌严重违纪违法,目前正接受国家开发投资集团有限公司纪检监察组纪律审查和安徽省池山西一煤老板,请客用15块茅台,13年竟无人看破,秘诀何在?全国各地的人民都知道,山西的特色就是煤矿多,所以当地也有不少的煤老板,都十分的有钱,而且很多人都经常说,山西的煤老板在平时也很大方,对员工也十分的慷慨,不过在看完一个山西矿老板的所