- 浏览: 15535 次
- 性别:
- 来自: 杭州
最新评论
转自:http://www.iteye.com/topic/980944
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
Java代码
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
实例分析
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码:
主要类:
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
Java代码
//设置parties、count及barrierCommand属性。 CyclicBarrier(int): //当await的数量到达了设定的数量后,首先执行该Runnable对象。 CyclicBarrier(int,Runnable): //通知barrier已完成线程 await():
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
实例分析
我们需要统计全国的业务数据。其中各省的数据库是独立的,也就是说按省分库。并且统计的数据量很大,统计过程也比较慢。为了提高性能,快速计算。我们采取并发的方式,多个线程同时计算各省数据,最后再汇总统计。在这里CyclicBarrier就非常有用。看代码:
主要类:
Java代码 /** * 各省数据独立,分库存偖。为了提高计算性能,统计时采用每个省开一个线程先计算单省结果,最后汇总。 * * @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! ======================================= 开始全国汇总 其它业务类 Java代码 /** * @author guangbo * */ public interface BillService { /** * 各省计费 * * @param code * 省编码 */ public void bill(String code); } /** * @author guangbo * */ public interface TotalService { /** * 汇总各省数据 */ public void count(); }
发表评论
-
开发工具备忘
2014-06-19 23:41 3331.谷歌公司的:guava; 2.apache公司的:Co ... -
java.util.date
2014-06-17 21:58 332<div class="iteye-blo ... -
(转) spring 的jar各包作用
2014-06-01 15:03 436转自:http://blog.csdn.net/c ... -
(转)Hibernate 的jar各包作用
2014-06-01 15:02 328转自:http://blog.csdn.net/cailian ... -
(转)Callable,Runnable比较及用法
2014-05-27 13:53 501转自:http://murielily.blog. ... -
(转)java Future 接口介绍
2014-05-27 13:52 437转自:http://blog.csdn.net/yangyan ... -
9_(JAVA基础300集最全教程 学习)自动装箱和拆箱
2014-05-16 00:08 541在JDK5.0中新增了自动装箱和拆箱,为开发人员解决了很多 ... -
8_(JAVA基础300集最全教程 学习)Collectioin各容器实现方式
2014-05-15 23:01 3341.ArrayList : 实现方式(非可序化Object数组 ... -
(转)java关键字Transient
2014-05-15 22:52 397转自:http://horst.sun.blog.163.co ... -
(转)Java使用JDBC连接Oracle_MSSQL实例
2014-05-14 23:20 456转自:http://blog.csdn.net/tungkee ... -
ant入门
2014-05-14 23:07 475这几天忙着看项目中的 ... -
(备忘)java.lang.Class类
2014-05-10 21:48 381转自:http://lavasoft.blog.51cto.c ... -
(备忘)native2ascii转码工具使用
2014-05-10 21:49 334native2ascii简介:native2ascii是sun ... -
(转)java.lang.Object类
2014-05-10 21:49 1627转自:http://lavasoft.blog.51cto.c ... -
(备忘录)xml文件的生成和解析_JDOM_4
2014-05-09 14:45 409import java.io.FileNotFou ... -
(备忘录)xml文件的生成和解析_DOM4J_3
2014-05-09 13:58 320import java.io.File; import ... -
(备忘录)xml文件的生成和解析_SAX_2
2014-05-09 11:51 427一边加载一边解析,速度快,内存占用小,但是如果再次使用时需要再 ... -
(转)J2EE十三个规范
2014-05-09 09:48 378转自:http://www.ibm.com/developer ... -
(备忘录)xml文件的生成和解析_DOM_1
2014-05-09 09:25 688xml的解析一般分为两种方式,一种是SAX事件流的方式,另外一 ... -
7_(JAVA基础300集最全教程 学习)方法重载overload
2014-05-08 22:23 434方法重载指的是同样一个方法的多种实现方式,例如我有个加法计算方 ...
相关推荐
CyclicBarrier的使用以及注意事项
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
CyclicBarrier是Java中的一个同步工具类,用于协调多个线程之间的同步。它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都...
用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620
NULL 博文链接:https://hubowei1.iteye.com/blog/2312471
1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 3.1 场景介绍 3.2 使用CyclicBarrier控制线程协作 循环使用CyclicBarrier 4.1 场景介绍 4.2 使用...
主要介绍了Java并发实例之CyclicBarrier的使用,涉及CyclicBarrier的介绍,以及相关的并发实例,具有一定参考价值,需要的朋友可以了解下。
主要为大家详细分析了Java并发系列之CyclicBarrier源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为 循环 的barrier。 CyclicBarrier 支持一个可选的 Runnable命令,...
主要介绍了java多线程之CyclicBarrier的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下:
CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续...
主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下
主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧