Java并发之CyclicBarrier工具类
一、CyclicBarrier工具类介绍
在上一篇文中我们介绍到了CountDownLatch工具类,其实CyclicBarrier和CountDownLatch工具类实现的功能差不多。我们可以从字面上理解CyclicBarrier意思就是可以循环使用的屏障。该工具类可以做到让一组线程到达一个屏障点的时候被阻塞,直到最后一个线程到达才开启屏障,继续往下执行。CyclicBarrier默认的构造方法是一个CyclicBarrier(int parties)。参数parties表示屏障需要拦截的线程数量。每个线程都会去调用await()方法通知道CyclicBarrier我已经到达屏障了。然后当前这个线程被阻塞,一直到所有的线程都到达屏障。另外CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties,Runnable barrier-Action),用于在线程到达屏障时,优先执行barrierAction中的业务代码,方便处理更复杂的业务场景需求。
场景使用:Boss要开会,会议需要等到N个人到齐才能够正常进行开展。这个场景中就适合使用CyclicBarrier工具类。
1
2 import java.io.IOException;
3 import java.util.concurrent.BrokenBarrierException;
4 import java.util.concurrent.CyclicBarrier;
5 import java.util.concurrent.ExecutorService;
6 import java.util.concurrent.Executors;
7
8 public class CyclicBarrierUserCase {
9
10 public static void main(String[] args) throws IOException, InterruptedException {
11
12 CyclicBarrier barrier = new CyclicBarrier(5,new Runnable() {
13 @Override
14 public void run() {
15 System.out.println(" 开会了,996工作要开始了!");
16 }
17 });
18
19 ExecutorService executor = Executors.newFixedThreadPool(5);
20 executor.submit(new Thread(new Worker(barrier, "项目经理")));
21 executor.submit(new Thread(new Worker(barrier, "产品经理")));
22 executor.submit(new Thread(new Worker(barrier, "程序员1号")));
23 executor.submit(new Thread(new Worker(barrier, "程序员2号")));
24 executor.submit(new Thread(new Worker(barrier, "程序员3号")));
25 executor.shutdown();
26
27 }
28
29
30
31 }
32 class Worker implements Runnable{
33 // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
34 private CyclicBarrier barrier;
35 private String name;
36
37 public Worker(CyclicBarrier barrier,String name){
38 this.barrier = barrier;
39 this.name = name;
40 }
41
42 @Override
43 public void run() {
44 try{
45 System.out.println(name + " 准备好了...");
46 // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
47 barrier.await();
48 }catch (InterruptedException e) {
49 e.printStackTrace();
50 } catch (BrokenBarrierException e) {
51 e.printStackTrace();
52 }
53 }
54 }
1 项目经理 准备好了...
2 程序员1号 准备好了...
3 程序员2号 准备好了...
4 程序员3号 准备好了...
5 产品经理 准备好了...
6 开会了,996工作要开始了!
其实await方法的处理逻辑除了一直等待到最后一个线程到达之外还有其他情况会终止线程的等待:
最后一个线程到达,即index == 0
超出了指定时间(超时等待)
其他的某个线程中断当前线程
其他的某个线程中断另一个等待的线程
其他的某个线程在等待barrier超时
其他的某个线程在此barrier调用reset()方法。reset()方法用于将屏障重置为初始状态。
二、CyclicBarrier和CountDownLatch的比较
1. CountDownLatch计数器不可以复用,即计数器使用以后不能够重置,但是CyclicBarrier可以调用reset()重置。当计算任务失败的时候可以重新计算。
2. CyclicBarrier提供了更多的方法例如getNumberWaiting方法可以获得Cyclic-Barrier 阻塞的线程数量。isBroken()方法用来了解阻塞的线程是否被中断。
3. CountDownLatch计数器是通过调用countDown()方法进行减一计算,调用await()方法只进行阻塞,对计数没任何影响。CyclicBarrier是通过调用await()方法进行加1运算。若加1后的值不等于构造方法的值,则线程阻塞。
Java并发之CyclicBarrier工具类的更多相关文章
- Java并发之同步工具类
1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...
- Java并发之CountDownLatch工具类
一.CountDownLatch工具类介绍 CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作.假设我们有这样的一 ...
- Java并发多线程 - 并发工具类JUC
安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
- Java线程的并发工具类
Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...
- Rhino+envjs-1.2.js 在java运行网站js 工具类
java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
随机推荐
- Mahout朴素贝叶斯文本分类
Mahout朴素贝叶斯文本分类算法 Mahout贝叶斯分类器按照官方的说法,是按照<Tackling the PoorAssumptions of Naive Bayes Text Classi ...
- 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践
对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...
- Java集合之Map
Map架构: 如上图: (1)Map是映射接口,Map中存储的内容是键值对(key-value) (2)AbstractMap是继承于Map的抽象类,实现了Map中的大部分API. (3)Sorted ...
- 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
GitHub操作总结 : 总结看不明白就看下面的详细讲解. . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details ...
- AngularJS进阶(一)深入理解ANGULARUI路由_UI-ROUTER
深入理解ANGULARUI路由_UI-ROUTER 最近在用 ionic写个webapp 看到几个demo中路由有好几种,搞的有点晕,查下资料研究下,做个笔记,其中大部分为摘抄别人的,做个说明免得被人 ...
- 100个Myeclipse6.5免费注册码
下面提供了100个MyEclipse6.5的注册码供大家使用: register name:cghidigfa Serial:pLR8ZC-855550-6359775146444620 ------ ...
- 队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...
- SpriteBuilder中如何简单的重置APP保存的数据
在任意一款APP中,我们可能需要在磁盘上保存一些游戏数据,以便在下一次运行APP时恢复游戏数据. 但是由于在测试阶段,我们需要快速恢复初始状态的游戏数据,该如何做呢? 非常简单,只需要将APP从真机或 ...
- OBJ-C中dispatch_once的用法
见如下代码: +(GameState*)sharedGameState{ static GameState *sharedInstance; static dispatch_once_t onceTo ...
- ERP-非财务人员的财务培训教(三)------公司/部门预算编制与评价
一.预算管理中的行为问题 二.编制预算中的问题 三.经营计划与预算制度 第一节 经营目标 第二节 预算编制的内容及说明 第三节 推行预算制度的组织 第 ...