`
peterwei
  • 浏览: 250362 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

并发编程一波流之CyclicBarrier

阅读更多
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();

}


实例讲解,力求简单易懂,高效实用。欢迎拍砖,谢绝漫骂。

分享到:
评论
2 楼 busiying119 2011-06-20  
问下楼主,既然5个省的计算数据都是只运行一次为什么一定要用多线程呢,个人感觉除了Total 类需要定时启动数据计算用到线程外,其余省的计算不需要线程控制,如果不是线程去完成任务,那么就有好多方法去控制业务顺序了(当5个省运行完再执行总局汇总)
1 楼 sniffer123 2011-03-31  
不错 以前我是一个个设标志位,每个线程执行完后更新各自的标志位,如果都齐了就执行。不过终止或者异常的处理就相当麻烦
用这玩意应该更方便些

相关推荐

    一波流资料压缩包.zip

    很抱歉,根据您提供的信息,"一波流资料压缩包.zip" 的描述过于简洁,没有提供具体的知识点内容。标签为空,且压缩包内的文件名称仅列出了一波流资料压缩包自身,这并不足以生成详细的IT知识。为了提供有价值的IT...

    行业分类-设备装置-一种应用于浮式平台的内波流载荷获取方法.zip

    浮式平台是海洋油气开发、可再生能源捕获以及科学研究等领域的重要设施,而内波流载荷则是影响这些平台稳定性和安全性的关键因素之一。 内波流载荷是指在海洋内部产生的波浪运动对浮式结构物产生的动态作用力,这种...

    大数据-算法-三维非结构波流耦合数值模型建立及应用研究.pdf

    综上所述,这篇论文通过大数据的处理能力和高级算法,构建了一个全面的三维非结构波流耦合数值模型,用于水动力学、水质、环流和溢油模拟等多个领域的研究,为实际问题的解决提供了强有力的技术支持。

    浸錫深度第二波流動方向.ppt

    【浸錫深度第二波流動方向】是焊接過程中的一個关键概念,主要涉及电子制造中的波峰焊工艺。在這個ppt中,讨论了多个影响焊接质量和效率的因素: 1. **助焊膜厚度**:助焊膜的作用在于保护金属表面免受氧化,促进...

    基于非结构化网格的波流耦合模拟及应用 (2014年)

    基于相同的非结构化网格同时模拟潮流和波浪,并通过参数的同步传递,即实现波流的耦合计算。模型中潮流基于三维水动力模型FVCOM,并引入波致辐射应力和水体紊动;波浪基于波谱平衡方程和光程函数方程求解,方程中均...

    1.20[EI]ORC用飞龙防HUM AM+FL2本1波流

    1.20[EI]ORC用飞龙防HUM AM+FL2本1波流.

    FlowPlusEditor:编辑人工谐波流+

    FlowPlusEditor是一款专门用于编辑人工谐波流的软件工具,其主要功能是帮助用户创建、修改和分析这种特定类型的流体动力学数据。人工谐波流(Artificial Harmonic Flow)在许多工程和科研领域中都有应用,例如流体...

    波流数值水池模拟研究 (2015年)

    文章首先指出,波流共存的情况比单独考虑波浪或海流更加复杂,因为两者间的相互作用会产生一系列非线性效应。为了研究这一现象,作者基于不可压缩流体的Navier-Stokes (N-S)方程构建了一个数学模型。Navier-Stokes...

    波流联合作用下隔水套管的涡激非线性振动* (2007年)

    考虑流及波流联合作用,研究了套管的涡激非线性振动。将套管简化为梁模型,计及莫里森非线性流体动力和涡激荷载,建立套管的涡激振动方程。采用克雷洛夫函数求解套管的固有频率和模态,提出了计算涡激非线性动力响应...

    大数据-算法-波流混合作用的完全非线性数值模拟.pdf

    大数据-算法

    一种深水受限三维空间水平井口连接管道系统的制作方法.docx

    这种模式中的关键环节之一是连接水下水平井口和管汇之间的管道系统,该系统不仅需要承受高温、高压、波流联合作用、地震等多种复杂载荷,还需要能够在受限三维空间内进行灵活布置。 #### 二、技术挑战与需求 传统的...

    操作系统_文件系统_课程设计报告_后附源代码_副本.doc

    这份课程设计报告由学生世波流男完成,并由教师瑞红指导。 1. **课程设计简介** - **目的**:该课程设计旨在让学生掌握操作系统的核心概念,特别是文件系统的原理和实现方法,提高他们的编程和系统设计能力。 - *...

Global site tag (gtag.js) - Google Analytics