简介
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
实例代码如下:
| 01 | publicclassCyclicBarrierTest { | 
 
| 03 |     staticCyclicBarrier c = newCyclicBarrier(2); | 
 
| 05 |     publicstaticvoidmain(String[] args) { | 
 
| 06 |         newThread(newRunnable() { | 
 
| 12 |                 } catch(Exception e) { | 
 
| 15 |                 System.out.println(1); | 
 
| 21 |         } catch(Exception e) { | 
 
| 24 |         System.out.println(2); | 
 
 
 
输出
或者输出
如果把new CyclicBarrier(2)修改成new CyclicBarrier(3)则主线程和子线程会永远等待,因为没有第三个线程执行await方法,即没有第三个线程到达屏障,所以之前到达屏障的两个线程都不会继续执行。
CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties, Runnable barrierAction),用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。代码如下:
| 01 | publicclassCyclicBarrierTest2 { | 
 
| 03 |     staticCyclicBarrier c = newCyclicBarrier(2, newA()); | 
 
| 05 |     publicstaticvoidmain(String[] args) { | 
 
| 06 |         newThread(newRunnable() { | 
 
| 12 |                 } catch(Exception e) { | 
 
| 15 |                 System.out.println(1); | 
 
| 21 |         } catch(Exception e) { | 
 
| 24 |         System.out.println(2); | 
 
| 27 |     staticclassA implementsRunnable { | 
 
| 31 |             System.out.println(3); | 
 
 
 
输出
CyclicBarrier的应用场景
CyclicBarrier可以用于多线程计算数据,最后合并计算结果的应用场景。比如我们用一个Excel保存了用户所有银行流水,每个Sheet保存一个帐户近一年的每笔银行流水,现在需要统计用户的日均银行流水,先用多线程处理每个sheet里的银行流水,都执行完之后,得到每个sheet的日均银行流水,最后,再用barrierAction用这些线程的计算结果,计算出整个Excel的日均银行流水。
CyclicBarrier和CountDownLatch的区别
- CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
- CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回true。
isBroken的使用代码如下:
| 01 | importjava.util.concurrent.BrokenBarrierException; | 
 
| 02 | importjava.util.concurrent.CyclicBarrier; | 
 
| 04 | publicclassCyclicBarrierTest3 { | 
 
| 06 |     staticCyclicBarrier c = newCyclicBarrier(2); | 
 
| 08 |     publicstaticvoidmain(String[] args) throwsInterruptedException, BrokenBarrierException { | 
 
| 09 |         Thread thread = newThread(newRunnable() { | 
 
| 15 |                 } catch(Exception e) { | 
 
| 23 |         } catch(Exception e) { | 
 
| 24 |             System.out.println(c.isBroken()); | 
 
 
 
输出
true
参考链接:http://ifeve.com/concurrency-cyclicbarrier/
参考链接:https://blog.csdn.net/zzg1229059735/article/details/61191679
												
												
								- JAVA线程同步辅助类CyclicBarrier循环屏障
		CyclicBarrier是一个同步辅助类,主要作用是让一组线程互相等待,知道都到达一个公共障点,在一起走.在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrie ... 
- 循环屏障CyclicBarrier以及和CountDownLatch的区别
		CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ... 
- Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
		Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ... 
- Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用
		  转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html  一:CountDownLatch CountDownLatch是一个执行 完成任务 ... 
- java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏
		简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Ti ... 
- 同步机制之--java CyclicBarrier 循环栅栏
		CyclicBarrier介绍一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待 ... 
- Java核心-多线程-并发控制器-CyclicBarrier同步屏障
		1.基本概念 中文译本同步屏障,同样来自jdk并发工具包中一个并发控制器,它的使用和CountDownLatch有点相似,能够完成某些相同并发场景,但是它们却不相同. 2.抽象模型 主要用来实现多个线 ... 
- java CyclicBarrier同步屏障
		CyclicBarrier的字面意思是可循环使用的屏障,它的主要作用是,让一组线程到达一个屏障时被阻塞,知道最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行. 1.简介: Cyc ... 
- js循环(while循环,do while循环,for循环)相关知识点及练习
		08.循环 1.循环! 循环的作用: 简化代码,处理重复执行的代码 遍历数组.json对象.节点集合 2.while循环 语法: while(循环的条件){ 循环体 } 3.循环的五大要素 循环变量  ... 
随机推荐
	
									- 访问 iframe 内部控件方法
			方法虽然简单,但是经常忘记,网上一查,很多方法兼容性都有问题,这段代码至少兼容IE和Chrome setInterval(function(){ document.getElementById('ma ... 
- MySQL中正则表达式
			正则表达式是用来匹配文本的特殊的串(字符集合),将一个模式(正则表达式)与一个文本串进行比较 从文本文件中提取电话号码 查找名字中间带有数字的文件 文本块中重复出现的单词 替换页面的URL为这些URL ... 
- 嵌入式LINUX设置时间
			date -s "2018-12-15 08:55:00" 安装NTP从网络获取时间 基于Linux的嵌入式开发,需要用到本地的时间,但是网上找了很多修改时间的命令,但大多是Lin ... 
- SpringMVC请求体参数处理问题
			如果请求定义为application/json格式,则要用Spring MVC中@RequestBody参数才能接受(用@RequestParam参数接受会报400错误),但SpringMVC的@Re ... 
- Flex Cairngorm框架知识整理
			简介: Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex RIA开发的最好框架之一.使用Cairngorm框架可以大大提高开发和维护的效率. Ca ... 
- python 术语
			python 术语 术语英文 术语中文 说明 PyPI(Python Package Index) 搜索python包的网站:https://pypi.org/ pip.easy_install 包管 ... 
- pip报错解决:EnvironmentError: mysql_config not found
			centos7下使用python类库MySQL-python操作mysql.pip安装类库:pip install MySQL-python报错提示:mariadb EnvironmentError: ... 
- LOJ 2586 「APIO2018」选圆圈——KD树
			题目:https://loj.ac/problem/2586 只会 19 分的暴力. y 都相等,仍然按直径从大到小做.如果当前圆没有被删除,那么用线段树把 [ x-r , x+r ] 都打上它的标记 ... 
- MQTT压力测试工具之JMeter插件教程
			基于Jmeter的MQTT测试插件-上 1. Jmeter插件简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.下载 用于对软件做压力测试,它最初被设计用于Web应用 ... 
- dubbo的三种运行方式
			1.Tomcat容器内启动 pom.xml 文件中 <build> <resources> <resource> <directory>src/main ...