barrierAction:当这些线程都达到barrier状态时会执行的内容。
CyclicBarrier中最重要的方法就是await方法 //挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务; public int await() throws InterruptedException, BrokenBarrierException { }; //让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务 public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { }; public class cyclicBarrierTest { public static void main(String[] args) throws InterruptedException { CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("线程组执行结束"); } }); for (int i = 0; i < 5; i++) { new Thread(new readNum(i,cyclicBarrier)).start(); } } static class readNum implements Runnable{ private int id; private CyclicBarrier cyc; public readNum(int id,CyclicBarrier cyc){ this.id = id; this.cyc = cyc; } @Override public void run() { synchronized (this){ System.out.println("id:"+id); try { cyc.await(); System.out.println("线程组任务" + id + "结束,其他任务继续"); } catch (Exception e) { e.printStackTrace(); } } } } } 输出结果: id:1 id:2 id:4 id:0 id:3 线程组执行结束 线程组任务3结束,其他任务继续 线程组任务1结束,其他任务继续 线程组任务4结束,其他任务继续 线程组任务0结束,其他任务继续 线程组任务2结束,其他任务继续 总结有了分析CountDownLatch、Semaphore的基础后,再来分析CyclicBarrier显然有了扎实的功底,分析起来顺手多了;
在这里我简要总结一下CyclicBarrier的流程的一些特性:
用途让一组线程互相等待,直到都到达公共屏障点才开始各自继续做各自的工作;
可重复利用,每正常走完一次流程,或者异常结束流程,那么接下来一轮还是可以继续利用CyclicBarrier实现线程等待功能;
共存亡,只要有一个线程有异常发生中断,那么其它线程都会被唤醒继续工作,然后接着就是抛异常处理;