CyclicBarrier介绍
来源:互联网 发布:python openstack开发 编辑:程序博客网 时间:2024/06/05 05:52
原文:http://www.iteye.com/topic/980944
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。主要方法:
- //设置parties、count及barrierCommand属性。
- CyclicBarrier(int):
- //当await的数量到达了设定的数量后,首先执行该Runnable对象。 total表示每次一起运行的线程总数,当每一轮线程运行结束后,执行afterthread线程。afterthread有点象方法运行结束后的回调函数
- CyclicBarrier(int total,Runnable afterthread):
- //通知barrier已完成线程
- await():
- 每执行一次awit()方法,brrier会-1,当构造函数参数变为0时,直到所有线程都准备就绪
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择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!
=======================================
开始全国汇总
其它业务类
- public interface BillService {
- /* 各省计费
- * @param code 省编码
- */
- public void bill(String code);
- }
- public interface TotalService {
- /** * 汇总各省数据 */
- public void count();
- }
作者注:这个程序并没有多次循环利用CyclicBarrier,CountDownLatch比CyclicBarrier更适合这个场景。之所以贴出这段代码,是因为这代码写得简单明了。要深入了解读下think in java第四版的赛马程序更合适,在725页。
0 0
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- CyclicBarrier介绍
- Java 栅栏 CyclicBarrier 介绍
- CyclicBarrier介绍及使用说明
- CountDownLatch和CyclicBarrier介绍
- CyclicBarrier和CountDownLatch介绍
- Chrome妙用
- uva 10453 Make Palindrome(DP)
- 数据结构和算法
- 最常用的设计模式---组合模式(C++实现)
- android自定义布局中的平滑移动 .
- CyclicBarrier介绍
- 袁腾飞讲述西方古代哲学思想
- 欲望
- 线程学习之-合并线程
- 修改Chrome默认搜索引擎为Google.com
- 调试技巧:assert 宏
- 汉字创意 字体图形化设计
- GC和访问修饰符
- Android类微信界面布局list_item