栅栏 CyclicBarrier

java.util.concurrent.CyclicBarrier 类是一种同步机制,它能够对处理一些算法的线程实现同步。换句话讲,它就是一个所有线程必须等待的一个栅栏,直到所有线程都到达这里,然后所有线程才可以继续做其他事情。

  1 package cyclicbarrier;
  2
  3 import java.util.concurrent.BrokenBarrierException;
  4 import java.util.concurrent.ConcurrentHashMap;
  5 import java.util.concurrent.CyclicBarrier;
  6
  7 public class Total {
  8     public static ConcurrentHashMap<String, Integer> result = new ConcurrentHashMap<String, Integer>();
  9     public static void main(String[] args) {
 10
 11         TotalService totalService = new TotalServiceImpl();
 12        CyclicBarrier barrier = new CyclicBarrier(5,
 13                new TotalTask(totalService));
 14
 15         // 实际系统是查出所有省编码code的列表,然后循环,每个code生成一个线程。
 16         new BillTask(new BillServiceImpl(), barrier, "北京").start();
 17         new BillTask(new BillServiceImpl(), barrier, "上海").start();
 18         new BillTask(new BillServiceImpl(), barrier, "广西").start();
 19         new BillTask(new BillServiceImpl(), barrier, "四川").start();
 20         new BillTask(new BillServiceImpl(), barrier, "黑龙江").start();
 21
 22    }
 23 }
 24
 25 /**
 26  * 主任务:汇总任务
 27  */
 28 class TotalTask implements Runnable {
 29    private TotalService totalService;
 30
 31     TotalTask(TotalService totalService) {
 32         this.totalService = totalService;
 33     }
 34
 35     public void run() {
 36         // 读取内存中各省的数据汇总,过程略。
 37         int totalCount = totalService.count();
 38         Total.result.put("total", totalCount);
 39         System.out.println("=======================================");
 40         System.out.println("开始全国汇总");
 41         System.out.println("全国汇总结果:" +  Total.result.get("total"));
 42     }
 43 }
 44
 45 /**
 46  * 子任务:计费任务
 47  */
 48 class BillTask extends Thread {
 49     // 计费服务
 50     private BillService billService;
 51     private CyclicBarrier barrier;
 52     // 代码,按省代码分类,各省数据库独立。
 53     private String code;
 54
 55     BillTask(BillService billService, CyclicBarrier barrier, String code) {
 56         this.billService = billService;
 57        this.barrier = barrier;
 58        this.code = code;
 59     }
 60
 61     public void run() {
 62        System.out.println("开始计算--" + code + "省--数据!");
 63         int ret = billService.bill(code);
 64         Total.result.put(code, ret);
 65         // 把bill方法结果存入内存,如ConcurrentHashMap,vector等,代码略
 66         System.out.println("结果:" + ret);
 67         System.out.println(code + "省已经计算完成,并通知汇总Service!");
 68        try {
 69             // 通知barrier已经完成
 70             barrier.await();
 71        } catch (InterruptedException e) {
 72             e.printStackTrace();
 73         } catch (BrokenBarrierException e) {
 74             e.printStackTrace();
 75        }
 76     }
 77 }
 78
 79 interface TotalService
 80 {
 81     public int count();
 82 }
 83
 84 class TotalServiceImpl implements TotalService
 85 {
 86     @Override
 87     public int count()
 88     {
 89         int totalCount = 0;
 90         for(String key : Total.result.keySet())
 91         {
 92             totalCount += Total.result.get(key);
 93         }
 94         return totalCount;
 95     }
 96 }
 97
 98 interface BillService
 99 {
100     public int bill(String code);
101 }
102 class BillServiceImpl implements BillService
103 {
104
105     @Override
106     public int bill(String code)
107     {
108         return 1;
109     }
110 }

Total.java

原文  http://blog.chinaunix.net/uid-7374279-id-4658408.html

时间: 2024-11-08 19:39:52

栅栏 CyclicBarrier的相关文章

栅栏——CyclicBarrier

栅栏CyclicBarrier和闭锁CountDownLatch类似,可以说它们都是用来计数,都能阻塞一组线程知道某个事件发生.不同的是闭锁用于等待事件,而栅栏用于等待其他线程. 在前一篇<CountDownLatch--闭锁的实现之一>中提到,在CountDownLatch里有一个计数器,一个线程完成一个任务后调用countdown方法使其计数器-1,等待线程则在执行方法前调用await方法,当CountDownLatch计数器减至0时将会放行的阻塞等待线程.那么CyclicBarrier所

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

CountDownLatch和CyclicBarrier的主要联系和区别如下: 1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数. 2.CountDownLatch是一次性的,CyclicBarrier可以重用. 3.CountDownLatch强调一个线程等多个线程完成某件事情.CyclicBarrier是多个线程互等,等大家都完成. 4.鉴于上面的描述,CyclicBarrier在一些场景中可以替代CountDownLatch实现类似的功能. 另外,值

并发编程——闭锁CountDownLatch 与 栅栏CyclicBarrier

Java并发编程实践 目录 并发编程—— ConcurrentHashMap 并发编程—— 阻塞队列和生产者-消费者模式 并发编程——闭锁CountDownLatch 与 栅栏CyclicBarrier 概述 第1部分 闭锁 第2部分 栅栏 参考 第1部分 闭锁 闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态.闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过.当闭锁到达结束状态后,将不会再改

多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public CountDownLatch(int count) //count 计数个数 例如:在主线程中启动10个子线程去数据库中获取分页数据,需要等到所有线程数据都返回之后统一做统计处理 public class CountDownLatchDemo implements Runnable{ private stat

24.循环栅栏 CyclicBarrier

import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 循环栅栏 CyclicBarrier * 可以反复使用的计数器 * 如:计数器设置为10,凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程 * * public CyclicBarrier(int parties, Runnab

循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public CyclicBarrier(int parties, Runnable barrierAction) parties:计数总数,也就是参与的线程总数. barrierAction 当计数器一次完成计数后,系统会执行的动作 下面代码展示了 司令要求10个士兵去完成任务,先集合10个然后去一起完成任务,等全部完成

栅栏cyclicbarrier

栅栏类似闭锁,但是它们是有区别的. 1.闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的线程才有可能继续执行;而栅栏没有类似countDown事件控制线程的执行,只有线程的await方法能控制等待的线程执行. 2.CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得等着. 场景分析:10个人去春游,规定达到一个地点后才能继续前行.代码如下 代码如下: im

Java并发编程之栅栏(CyclicBarrier)详解

栅栏类似闭锁,但是它们是有区别的. 闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的线程才有可能继续执行;而栅栏没有类似countDown事件控制线程的执行,只有线程的await方法能控制等待的线程执行. CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得等着. 场景分析:10个人去春游,规定达到一个地点后才能继续前行.代码如下 import java.

回环栅栏CyclicBarrier

通过它可以实现让一组线程等待至某个状态之后再全部同时执行.叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器: ? 1 2 3 4 5 public CyclicBarrier(int parties, Runnable barrierAction)