【java.util.concurrent】CyclicBarrier解析
2016-08-09 00:00
567 查看
一、概念
有点类似CountDownLatch类,只是CountDownLatch只触发一次事件,而CyclicBarrier可以多次重用。如果你希望多线程并行执行任务,需等待所有线程均已完成现步骤之后再进入下一步骤,直至最后所有任务完成。
二、代码示例
本人觉得《Thinking in Java》中的赛马例子非常好,能够一目了然。所以,在此就借用该书例子,如下:
最初结果展示:
最终结果展示:
可以明显看出,在所有的马都向前移动时,CyclicBarrier将自动调用Runnable栅栏动作,必须在栅栏处等待所有的马都完成本回合比赛。
有点类似CountDownLatch类,只是CountDownLatch只触发一次事件,而CyclicBarrier可以多次重用。如果你希望多线程并行执行任务,需等待所有线程均已完成现步骤之后再进入下一步骤,直至最后所有任务完成。
二、代码示例
本人觉得《Thinking in Java》中的赛马例子非常好,能够一目了然。所以,在此就借用该书例子,如下:
class Horse implements Runnable { private static int counter = 0; private final int id = counter++; private int strides = 0; private static Random rand = new Random(47); private static CyclicBarrier barrier; public Horse(CyclicBarrier b) { barrier = b; } public synchronized int getStrides() { return strides; } public void run() { try { while (!Thread.interrupted()) { synchronized (this) { strides += rand.nextInt(3); // Produces 0, 1 or 2 } barrier.await(); } } catch (InterruptedException e) { // A legitimate way to exit } catch (BrokenBarrierException e) { // This one we want to know about throw new RuntimeException(e); } } public String toString() { return "Horse " + id + " "; } public String tracks() { StringBuilder s = new StringBuilder(); for (int i = 0; i < getStrides(); i++) s.append("*"); s.append(id); return s.toString(); } } public class HorseRace { static final int FINISH_LINE = 75; private List<Horse> horses = new ArrayList<Horse>(); private ExecutorService exec = Executors.newCachedThreadPool(); private CyclicBarrier barrier; public HorseRace(int nHorses, final int pause) { barrier = new CyclicBarrier(nHorses, new Runnable() { public void run() { StringBuilder s = new StringBuilder(); for (int i = 0; i < FINISH_LINE; i++) s.append("="); // The fence on the racetrack System.out.println(s); for (Horse horse : horses) System.out.println(horse.tracks()); for (Horse horse : horses) if (horse.getStrides() >= FINISH_LINE) { System.out.println(horse + "won!"); exec.shutdownNow(); return; } try { TimeUnit.MILLISECONDS.sleep(pause); } catch (InterruptedException e) { print("barrier-action sleep interrupted"); } } }); for (int i = 0; i < nHorses; i++) { Horse horse = new Horse(barrier); horses.add(horse); exec.execute(horse); } } public static void main(String[] args) { int nHorses = 7; int pause = 200; if (args.length > 0) { // Optional argument int n = new Integer(args[0]); nHorses = n > 0 ? n : nHorses; } if (args.length > 1) { // Optional argument int p = new Integer(args[1]); pause = p > -1 ? p : pause; } new HorseRace(nHorses, pause); } }
最初结果展示:
最终结果展示:
可以明显看出,在所有的马都向前移动时,CyclicBarrier将自动调用Runnable栅栏动作,必须在栅栏处等待所有的马都完成本回合比赛。
相关文章推荐
- java.util.concurrent.CyclicBarrier同步屏障工具类源码解析
- java.util.concurrent.CyclicBarrier组件说明
- java.util.concurrent包(6)——CyclicBarrier使用
- Java多线程工具包java.util.concurrent---CyclicBarrier
- java.util.concurrent.CyclicBarrier
- java.util.concurrent 之 CyclicBarrier
- java.util.concurrent.CyclicBarrier 与 java.util.concurrent.CountDownLatch
- java.util.concurrent.CyclicBarrier
- java.util.concurrent.CyclicBarrier 使用
- Java多线程——java.util.concurrent库中的CyclicBarrier和CountDownLatch工具
- java.util.concurrent中:同步屏障CyclicBarrier
- java.util.concurrent 下的Semaphore CyclicBarrier CountDownLatch 分析使用
- think in java笔记: java.util.concurrent.CyclicBarrier
- java.util.concurrent下同步辅助类CyclicBarrier
- 《java.util.concurrent 包源码阅读》21 CyclicBarrier和CountDownLatch
- java.util.concurrent.CyclicBarrier
- java.util.concurrent.CyclicBarrier
- java.util.concurrent之CyclicBarrier
- java.util.concurrent 中的CyclicBarrier用于多线程测试
- 聊聊高并发(四十一)解析java.util.concurrent各个组件(十七) 任务的异步执行和状态控制