java CyclicBarrier(关卡)详解
来源:互联网 发布:炫浪网络社区下载 编辑:程序博客网 时间:2024/05/01 15:27
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 在并行迭代算法中非常有用,这个算法会把一个问题拆分成一系列相互独立的子问题,当线程到达公共屏障点时,调用await,await会被阻塞,直到所有线程都到达公共屏障点,这样公共屏障点就被成功突破,这样所有的线程都被释放。
CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
demo:
import java.util.Map.Entry;import java.util.Random;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CyclicBarrier;/** * 各省数据独立,分库存偖。为了提高计算性能,统计时采用每个省开一个线程先计算单省结果,最后汇总。 * */ public class CyclicBarrierDemo{ public static void main(String[] args) { TotalService totalService = new TotalServiceImpl(); //计算汇总信息 CyclicBarrier barrier = new CyclicBarrier(5, new TotalTask(totalService)); //totaltask由最后一个进入的线程启动 // 实际系统是查出所有省编码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(){} TotalTask(TotalService totalService) { this.totalService = totalService; } public void run() { // 读取内存中各省的数据汇总。 System.out.println("======================================="); System.out.println("开始全国汇总"); totalService.count(); } } interface TotalService{public void count();}class TotalServiceImpl implements TotalService{public void count(){Integer totalSum=new Integer(0);ConcurrentHashMap<String, Integer> conmap=BillServiceImpl.conmap;for(Entry<String, Integer> entry:conmap.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());totalSum+=(Integer)entry.getValue();}System.out.println("全国数据总额为:"+totalSum.intValue());}}/** * 子任务:计费任务 */ class BillTask extends Thread { // 计费服务 private BillService billService; private CyclicBarrier barrier; // 代码,按省代码分类,各省数据库独立。 private String code; BillTask(){} BillTask(BillService billService, CyclicBarrier barrier, String code) { this.billService = billService; this.barrier = barrier; this.code = code; } public void run() { billService.bill(code); // 把bill方法结果存入内存,如ConcurrentHashMap,vector等,代码略 // System.out.println(code + "省已经计算完成,并通知汇总Service!"); try { // 通知barrier已经完成 barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } interface BillService{public void bill(String code);}class BillServiceImpl implements BillService{public static ConcurrentHashMap<String, Integer> conmap=new ConcurrentHashMap<String, Integer>();public void bill(String code){conmap.put(code, new Random().nextInt(1000));System.out.println("开始计算--" + code + "省--数据!");System.err.println(code+"--数据--计算中---");System.err.println(code + "省已经计算完成,并通知汇总Service!");}}
- java CyclicBarrier(关卡)详解
- java线程:CyclicBarrier使用详解
- Java多线程--CyclicBarrier使用详解
- Java并发学习笔记(15)信号量(Semaphore) 关卡((2)CyclicBarrier)
- Java并发编程之栅栏(CyclicBarrier)详解
- Synchronizer 闭锁(CountDownLatch,FutureTask ) 信号量(Semaphore) 关卡(CyclicBarrier) 知识点总结(java并发编程实践读书笔记三)
- java CyclicBarrier
- Java CyclicBarrier
- Java CyclicBarrier
- java CyclicBarrier
- java CyclicBarrier
- Java CyclicBarrier
- Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
- java.util.concurrent包详解:CyclicBarrier和CountDownLatch
- CyclicBarrier使用详解
- CountDownLatch与CyclicBarrier详解
- CyclicBarrier类 详解
- CyclicBarrier使用详解
- Android 模拟器创建参数说明
- Android AppWidget跳转无法传值问题
- 在Android 项目时的防止Memory leak 要注意的事项
- JQuery select控件的相关操作收集
- 书 - 该看的 想看的书
- java CyclicBarrier(关卡)详解
- EJB3.0学习笔记---Bean实现多个接口的情况下定义,访问方式:
- 中关村翠湖科技园:高端产业聚集区 (zz.IS2120@BG57IV3.T752270541 .K)
- svn checkout单个文件
- 李开复雷军争抢移动互联网入口:难撼行业格局
- 启动JBoss出现“java.lang.noclassdeffounderror org/apache/commons/lang3/stringutils jar”解决
- 苹果官方推荐的应用软件
- maven仓库配置-经典
- clock_gettime参数介绍