CyclicBarrier同样是一个控制程序并发流程的类。它允许一组线程相互等待,直到到达某个公共的屏障点 Barrier point。在一组固定大小的线程的程序中,这些线程可能需要不时的相互等待。这时就需要用到CyclicBarrier。这也是和CountDownLatch的区别所在。CountDownLatch可以在一个点等待所有线程的返回,但是当count减为0的时候,值是不能重置的。而这个barrier
在释放等待线程以后可以重新使用。所以我们把这个叫做可以循环的barrier。
CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(在释放所有线程之前),该命令只在每个屏障点运行一次。
public class Test { private int threadCount; private CyclicBarrier barrier; private int loopCount = 10; public Test(int count){ threadCount=count; barrier = new CyclicBarrier(count,new Runnable(){ public void run(){ System.out.println("through barrier!"); } }); for (int i=0; i< threadCount;i++){ Thread thread = new Thread("thread"+i){ public void run(){ for(int j=0; j<loopCount;j++){ System.out.println(currentThread().getName()+" is running "+j+"times"); try{ barrier.await(); }catch(Exception e){ e.printStackTrace(); } } } }; thread.start(); } } public static void main(String args[]){ Test t = new Test(3); } }
public CyclicBarrier(int parties, Runnable barrierAction) // 创建一个信的CyclicBarrier, 它将在给定数量的参与者处于等待状态的时候启动, 并在启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。 barrierAction:启动barrier时执行的命令