CyclicBarrier

来源:互联网 发布:淘宝生鲜都发空运吗 编辑:程序博客网 时间:2024/06/07 13:39

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。

 CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。

  举个栗子:几个小朋友去一起去上学,大家会在一个地方集中,所有的小朋友都要先从家里到达集中地,等集中地所有小朋友都到齐之后,然后一起去学校。这个集中地就是公共屏障点

下面就这个场景实现:

/**    * Copyright © 2017 公司名称. All rights reserved. *  * @Title: CyclicBarrierTest.java  * @Prject: thread * @Package: com.sun.test.cyclicBarrier  * @Description: TODO * @author: sunqz    * @date: 2017年5月30日 下午9:36:45  * @version: V1.0    */package com.sun.test.cyclicBarrier;import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/**  * @ClassName: CyclicBarrierTest  * @Description: 测试CyclicBarries * @author: sunqz * @date: 2017年5月30日 下午9:36:45   */public class CyclicBarrierTest {private static CyclicBarrier barrier = new CyclicBarrier(3);/** *  * @ClassName: Child  * @Description: 模拟小朋友去上学线程 * @author: Dell * @date: 2017年5月30日 下午9:40:00 */public static class Child implements Runnable {           private String name;          public Child(String name) {                  this.name = name;      }      @Override      public void run() {          try {              Thread.sleep(1000 * (new Random()).nextInt(5));              System.out.println(name + " 到达集中地.");              barrier.await();          } catch (InterruptedException e) {              e.printStackTrace();          } catch (BrokenBarrierException e) {              e.printStackTrace();          }          System.out.println(name + " Go school !!");      }  } public static void main(String[] args) {   Thread t1 = new Thread(new Child("小明"));   Thread t2 = new Thread(new Child("小华"));   Thread t3 = new Thread(new Child("小芳"));   t1.start();   t2.start();   t3.start();}}


打印结果:

小明 到达集中地.
小芳 到达集中地.
小华 到达集中地.
小华 Go school !!
小明 Go school !!
小芳 Go school !!

原创粉丝点击