CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
//设置parties、count及barrierCommand属性。
CyclicBarrier(int):
//当await的数量到达了设定的数量后,首先执行该Runnable对象。
CyclicBarrier(int,Runnable):
//通知barrier已完成线程
await():
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
实例分析
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码:
主要类:
/**
* 各省数据独立,分库存偖。为了提高计算性能,统计时采用每个省开一个线程先计算单省结果,最后汇总。
*
* @author guangbo email:weigbo@163.com
*
*/
public class Total {
// private ConcurrentHashMap result = new ConcurrentHashMap();
public static void main(String[] args) {
TotalService totalService = new TotalServiceImpl();
CyclicBarrier barrier = new CyclicBarrier(5,
new TotalTask(totalService));
// 实际系统是查出所有省编码code的列表,然后循环,每个code生成一个线程。
new BillTask(new BillServiceImpl(), barrier, "北京").start();
new BillTask(new BillServiceImpl(), barrier, "上海").start();
new BillTask(new BillServiceImpl(), barrier, "广西").start();
new BillTask(new BillServiceImpl(), barrier, "四川").start();
new BillTask(new BillServiceImpl(), barrier, "黑龙江").start();
}
}
/**
* 主任务:汇总任务
*/
class TotalTask implements Runnable {
private TotalService totalService;
TotalTask(TotalService totalService) {
this.totalService = totalService;
}
public void run() {
// 读取内存中各省的数据汇总,过程略。
totalService.count();
System.out.println("=======================================");
System.out.println("开始全国汇总");
}
}
/**
* 子任务:计费任务
*/
class BillTask extends Thread {
// 计费服务
private BillService billService;
private CyclicBarrier barrier;
// 代码,按省代码分类,各省数据库独立。
private String code;
BillTask(BillService billService, CyclicBarrier barrier, String code) {
this.billService = billService;
this.barrier = barrier;
this.code = code;
}
public void run() {
System.out.println("开始计算--" + code + "省--数据!");
billService.bill(code);
// 把bill方法结果存入内存,如ConcurrentHashMap,vector等,代码略
System.out.println(code + "省已经计算完成,并通知汇总Service!");
try {
// 通知barrier已经完成
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
结果:
开始计算--北京省--数据!
开始计算--上海省--数据!
北京省已经计算完成,并通知汇总Service!
开始计算--四川省--数据!
四川省已经计算完成,并通知汇总Service!
上海省已经计算完成,并通知汇总Service!
开始计算--广西省--数据!
广西省已经计算完成,并通知汇总Service!
开始计算--黑龙江省--数据!
黑龙江省已经计算完成,并通知汇总Service!
=======================================
开始全国汇总
其它业务类
/**
* @author guangbo
*
*/
public interface BillService {
/**
* 各省计费
*
* @param code
* 省编码
*/
public void bill(String code);
}
/**
* @author guangbo
*
*/
public interface TotalService {
/**
* 汇总各省数据
*/
public void count();
}
实例讲解,力求简单易懂,高效实用。欢迎拍砖,谢绝漫骂。
分享到:
相关推荐
一波流资料压缩包.zip
论文研究-实时任波流的一个接入控制算法.pdf, 研究具有实时限制的任波流的接入控制算法,对给定时间要求的任波流,当该算法运行结果给出成功信息时,就找到了满足要求的...
波流共同作用下离岸式高桩码头上部结构不规则波浮托力试验研究,严士常,陈小婷,本文通过室内波浪物理模型试验研究了波浪、水流共同作用下离岸式高桩码头上部结构浮托力。试验中考虑不同波要素、波浪入射角、波
行业分类-设备装置-一种应用于浮式平台的内波流载荷获取方法.zip
波流边界层内外流速剖面的数值模拟,张弛,李诚,准确模拟波流相互作用下的流场结构是河口海岸动力学研究与工程实践的一个重要课题。在传统波流边界层数学模型的基础上,引入了波
浸錫深度第二波流動方向.ppt
基于相同的非结构化网格同时模拟潮流和波浪,并通过参数的同步传递,即实现波流的耦合计算。模型中潮流基于三维水动力模型FVCOM,并引入波致辐射应力和水体紊动;波浪基于波谱平衡方程和光程函数方程求解,方程中均...
渔网在波流作用下的等效网面方法,苏炜, 詹杰民,摘要:本文通过把一系列杆相互铰接在一起,建立网的模型,模拟网在来流作用下的变形和受力.作用在杆上的水动力可以通过Morison公式�
波流联合作用下隔水管振动的有限元分析,李妍,吴艳新,采用有限单元法进行了隔水管的动力分析。通过隔水管自振反应分析验证了动力分析方法的正确性,获得了波流联合作用下隔水管的位移
波流环境下双孔射流运动和稀释特性实验研究,江东勃,陈永平,为了研究波流环境下双孔射流的运动和稀释特性,分别采用粒子图像测速(PIV)和平面荧光诱导(PLIF)技术对其速度场和浓度场进行了�
波流共同作用下海底管线周围海床的动力响应分析,张小玲,,本文针对埋设有海底管线的多孔介质海床,基于Biot动力固结理论,采用Pastor-Zienkiewicz III的动力弹塑性本构模型,建立了一个多孔介质的�
1.20[EI]ORC用飞龙防HUM AM+FL2本1波流.
大数据-算法-三维非结构波流耦合数值模型建立及应用研究.pdf
波流共存时会产生复杂的非线性相互作用,其联合作用比单纯的波浪或单纯的海流问题要复杂很多.基于不可压缩流体N-S方程建立数学模型,VOF 法追踪自由液面,通过在动量方程中添加源项实现阻尼消波,利用商业软件平台FLUENT...
FlowPlusEditor 编辑人工谐波流+
考虑流及波流联合作用,研究了套管的涡激非线性振动。将套管简化为梁模型,计及莫里森非线性流体动力和涡激荷载,建立套管的涡激振动方程。采用克雷洛夫函数求解套管的固有频率和模态,提出了计算涡激非线性动力响应...
大数据-算法
大数据-算法
大数据-算法
大数据-算法