應用場景
在某種需求中,比如一個大型的任務,常常需要分配好多子任務去執行,只有當所有子任務都執行完成時候,才能執行主任務,這時候,就可以選擇CyclicBarrier了。
實例分析
我們需要統計全國的業務數據。其中各省的數據庫是獨立的,也就是說按省分庫。並且統計的數據量很大,統計過程也比較慢。爲了提高性能,快速計算。我們採取併發的方式,多個線程同時計算各省數據,最後再彙總統計。在這裏CyclicBarrier就非常有用。看代碼:
主要類:
- /**
- * 各省數據獨立,分庫存偖。爲了提高計算性能,統計時採用每個省開一個線程先計算單省結果,最後彙總。
- *
- * @author guangbo email:[email protected]
- *
- */
- 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!
=======================================
開始全國彙總
CyclicBarrier介紹 (二)
張孝祥視頻學習筆記:
CyclicBarrier 表示大家彼此等待,大家集合好後纔開始出發,分散活動後又在i指定地點集合碰面,這就好比整個公司的人員利用週末時間集體郊遊一樣,先各自從家出發到公司集合後,再同時出發到公園遊玩,在指定地點集合後再同時開始就餐……
iimport java.util.concurrent.BrokenBarrierException;
運行結果:
線程pool-1-thread-3即將到達集合地點1,當前已有1個已到達正在等候
線程pool-1-thread-2即將到達集合地點1,當前已有2個已到達正在等候
線程pool-1-thread-1即將到達集合地點1,當前已有3個已到達都到齊了,繼續走啊
線程pool-1-thread-1即將到達集合地點2,當前已有1個已到達正在等候
線程pool-1-thread-2即將到達集合地點2,當前已有2個已到達正在等候
線程pool-1-thread-3即將到達集合地點2,當前已有3個已到達都到齊了,繼續走啊
線程pool-1-thread-2即將到達集合地點3,當前已有1個已到達正在等候
線程pool-1-thread-1即將到達集合地點3,當前已有2個已到達正在等候
線程pool-1-thread-3即將到達集合地點3,當前已有3個已到達都到齊了,繼續走啊