Java5多线程---同步辅助工具类CyclicBarrier
一、概述
CyclicBarrier是一个同步的辅助类,它允许一组线程互相等待,直到到达某个公告屏障点。在设计一组固定大小的线程的程序中,这些线程必须不时的相互等待,此时它很有用,因为该屏障在释放等待线程后可以重用,所以称它为循环的屏障下面看看对应的方法。
1、public CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的CycleBarrier,它将在给定数量的参与者(线程)处于等待状态时候启动,并在启动barrier时执行给定的屏障操作,该操作由最后一个今日的屏障的线程执行。参数barrierAction是在启动屏障的时候执行命令,如果不执行任何操作则该参数是null
2、public int await()
在所有参与者都已经在此barrier上调用 await方法之前,将一直等待。如果当前线程部署将要到达的最后一个线程将禁用它。
3、isBroken
查询此屏障是否处于损坏状态
4、reset
将屏障重置为其初始化状态,如果所有参与者目前都在屏障处等待,则它们将返回,而且会抛出一个异常
5、getNumberWaiting
返回当前在屏障处等待的参与者数目。
二、应用案例
每年都有新兵蛋子入伍,那么每天的集合报到操练是必不可少的。那么我们来利用CyclicBarrier来模拟新兵蛋子 集合-报到-报数-报数完毕-各自入队 这个流程。具体代码如下:
package java5; import java.util.concurrent.CyclicBarrier; /*** * CyclicBarrier 同步辅助类的使用 * 20个新兵蛋子 集合-报到-报数-各自归队 * @author dongtian * @date 2015年6月16日 下午3:20:38 */ public class MyArmy { private static CyclicBarrier cyclicBarrier = new CyclicBarrier(20); /*** * 集合任务 * @author dongtian * @date 2015年6月16日 下午2:50:55 */ private static class SetTask extends Thread { @Override public void run() { try { //开始报到 System.err.println( Thread.currentThread().getName() + " 报到"); Thread.currentThread().sleep(1000); cyclicBarrier.await(); //开始报数 System.err.println(Thread.currentThread().getName() +" 开始报数..."); cyclicBarrier.await(); System.err.println(Thread.currentThread().getName() +" 报数完毕!"); //等到都报完各自归队 cyclicBarrier.await(); System.err.println(Thread.currentThread().getName() +" 归队"); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { for (int i = 0; i < 20; i++) { SetTask setTask = new SetTask(); setTask.start(); } } }
运行结果如下:
Thread-0 报到 Thread-2 报到 Thread-1 报到 Thread-10 报到 Thread-8 报到 Thread-6 报到 Thread-4 报到 Thread-3 报到 Thread-5 报到 Thread-7 报到 Thread-14 报到 Thread-11 报到 Thread-9 报到 Thread-16 报到 Thread-13 报到 Thread-15 报到 Thread-17 报到 Thread-19 报到 Thread-12 报到 Thread-18 报到 Thread-2 开始报数... Thread-19 开始报数... Thread-0 开始报数... Thread-16 开始报数... Thread-3 开始报数... Thread-1 开始报数... Thread-7 开始报数... Thread-4 开始报数... Thread-5 开始报数... Thread-6 开始报数... Thread-13 开始报数... Thread-12 开始报数... Thread-9 开始报数... Thread-11 开始报数... Thread-14 开始报数... Thread-17 开始报数... Thread-18 开始报数... Thread-15 开始报数... Thread-10 开始报数... Thread-8 开始报数... Thread-8 报数完毕! Thread-2 报数完毕! Thread-19 报数完毕! Thread-0 报数完毕! Thread-16 报数完毕! Thread-4 报数完毕! Thread-5 报数完毕! Thread-7 报数完毕! Thread-6 报数完毕! Thread-1 报数完毕! Thread-3 报数完毕! Thread-13 报数完毕! Thread-12 报数完毕! Thread-11 报数完毕! Thread-9 报数完毕! Thread-18 报数完毕! Thread-17 报数完毕! Thread-14 报数完毕! Thread-10 报数完毕! Thread-15 报数完毕! Thread-15 归队 Thread-2 归队 Thread-19 归队 Thread-8 归队 Thread-0 归队 Thread-4 归队 Thread-6 归队 Thread-7 归队 Thread-5 归队 Thread-1 归队 Thread-13 归队 Thread-12 归队 Thread-16 归队 Thread-3 归队 Thread-9 归队 Thread-18 归队 Thread-11 归队 Thread-14 归队 Thread-10 归队 Thread-17 归队
具体其它方法可参考官方API文档