java.util.concurrent.CyclicBarrier 使用
1.概述
java.util.concurrent.CyclicBarrier(循环的栅栏), 构造时设置一个计数器数(count),
各线程通过调用barrier.await()进入等待,并且计数+1, 第count个线程调用await(),满足条件,
唤醒所有之前调用await等待的线程(类似于公司班车, A上车A等着,B上车B等着, ...最后一个Z上车了, 班车发车)
2. 示例
package com.rocky.test.CyclicBarrier; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(10, new Runnable(){ public void run(){ System.out.println("inside barrier.................."+ Thread.currentThread().getName()); } }); for(int i=0; i<10; i++) new Thread(new Worker(barrier)).start(); } } class Worker implements Runnable{ private CyclicBarrier barrier; Worker(CyclicBarrier barrier){ this.barrier = barrier; } @Override public void run() { System.out.println(Thread.currentThread().getName()+" ready go... "); try { barrier.await(); System.out.println(Thread.currentThread().getName()+" done"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }
控制台
.......... Thread-8 ready go... Thread-9 ready go... //最后一个执行await()的线程,会执行构造CyclicBarrier时Runnable中的任务(run()方法) inside barrier..................Thread-9 Thread-9 done Thread-0 done ..............
3. 说明 和CountDownLatch比较
3.1 之所以叫CyclicBarrier(cyclic循环之意), 因为构造时设置的count可以循环运用
一圈await结束之后, 线程继续调用await进入下一轮等待直到第count个线程await时一起唤醒。
3.2 await()方法带有返回值,表示当前是第几个到达barrier的线程
3.3 BrokenBarrierException异常 当某个等待的线程发生中断,会抛出该异常,其他等待的线程也会收到该异常,并返回。
.......... if (g.broken) throw new BrokenBarrierException();