CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。今天我们就学习一下CyclicBarrier的用法。
CyclicBarrier的简单使用
类CyclicBarrier不仅有CountDownLatch所具有的功能,还可以实现屏障等待的功能,也就是阶段性同步,它在使用上的意义在于可以循环地实现线程要一起做任务的目标,而不是像类CountDownLatch一样,仅仅支持一次线程与同步点阻塞的特性。
关于CyclicBarrier常用的方法的介绍:
package com.linux.huhx.concurreny;import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class CyclicBarrierTest1 {public static void main(String[] args) throws IOException, InterruptedException {/*** 1、如果参数>3的话,三个线程的await执行完,parties只能加到3。那么子线程await后续的方法就不能执行* 2、如果参数=3的话,三个线程的await执行完,parties能加到3。所以子线程await后续的方法能执行* 3、如果参数<3的话,当第二个线程await执行完之后,parties加到了2。??????*/CyclicBarrier barrier = new CyclicBarrier(3);ExecutorService executor = Executors.newFixedThreadPool(3);executor.submit(new Thread(new Runner(barrier, "1号选手")));executor.submit(new Thread(new Runner(barrier, "2号选手")));executor.submit(new Thread(new Runner(barrier, "3号选手")));Thread.sleep(200);System.out.println("in main method after");executor.shutdown();}public static class Runner implements Runnable {// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)private CyclicBarrier barrier;private String name;public Runner(CyclicBarrier barrier, String name) {super();this.barrier = barrier;this.name = name;}@Overridepublic void run() {try {Thread.sleep(new Random().nextInt(1000));System.out.println(name + " 准备好了...");// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println(name + " 起跑!");}} }
运行的结果如下:执行的结果不固定
in main method after 2号选手 准备好了... 1号选手 准备好了... 3号选手 准备好了... 2号选手 起跑! 1号选手 起跑! 3号选手 起跑!
友情链接
- 比较好的参考博客:http://blog.csdn.net/shihuacai/article/details/8856407