zoukankan      html  css  js  c++  java
  • CyclicBarrier介绍

    应用场景
    在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择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!
    =======================================
    开始全国汇总

  • 相关阅读:
    Linux系统下设置Tomcat开机自动启动
    2、nginx配置文件基本介绍
    1、Centos7下安装nginx
    40、springboot——运行状态监控使用Actuator
    39、springboot——热部署
    38、springboot——分布式之SpringCloud
    38、springboot——分布式之zookeeper+dubbo
    37、springboot——安全
    36、springboot——异步任务、定时任务、邮件任务
    React过誉了吗?
  • 原文地址:https://www.cnblogs.com/dand/p/10675114.html
Copyright © 2011-2022 走看看