CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。
用法略有不同,测试代码如下:
1 public class TestCyclicBarrier { 2 3 private static final int THREAD_NUM = 5; 4 5 public static class WorkerThread implements Runnable{ 6 7 CyclicBarrier barrier; 8 9 public WorkerThread(CyclicBarrier b){ 10 this.barrier = b; 11 } 12 13 @Override 14 public void run() { 15 // TODO Auto-generated method stub 16 try{ 17 System.out.println("Worker's waiting"); 18 //线程在这里等待,直到所有线程都到达barrier。 19 barrier.await(); 20 System.out.println("ID:"+Thread.currentThread().getId()+" Working"); 21 }catch(Exception e){ 22 e.printStackTrace(); 23 } 24 } 25 26 } 27 28 /** 29 * @param args 30 */ 31 public static void main(String[] args) { 32 // TODO Auto-generated method stub 33 CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() { 34 //当所有线程到达barrier时执行 35 @Override 36 public void run() { 37 // TODO Auto-generated method stub 38 System.out.println("Inside Barrier"); 39 40 } 41 }); 42 43 for(int i=0;i<THREAD_NUM;i++){ 44 new Thread(new WorkerThread(cb)).start(); 45 } 46 } 47 48 } 49 /* 50 以下是输出: 51 Worker's waiting 52 Worker's waiting 53 Worker's waiting 54 Worker's waiting 55 Worker's waiting 56 Inside Barrier 57 ID:12 Working 58 ID:8 Working 59 ID:11 Working 60 ID:9 Working 61 ID:10 Working 62 */
- CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。
- CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
- CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。