java CyclicBarrier(关卡)详解

5 篇文章 0 订阅
4 篇文章 0 订阅

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (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!");
	}
}


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值