CyclicBarrier

  CyclicBarrier也叫回环栅栏,在JDK1.5被引入,可以让一组线程达到一个栅栏时被阻塞,直到最后一个线程达到栅栏时,所以被阻塞的线程才能继续执行。
  CyclicBarrier好比一扇门,默认情况下关闭状态,堵住了线程执行的道路,直到所有线程都就位,门才打开,让所有线程一起通过。
  叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
  栅栏举例:几个人准备去聚餐,约定什么时间在某个地方等,先到的人要等所有人到了之后再一起出发。


两个构造方法:

  public CyclicBarrier(int parties, Runnable barrierAction) {}

 
  public CyclicBarrier(int parties) {}
  
  参数parties指让多少个线程或者任务等待至barrier状态。
  参数barrierAction是一个Runnable,当成功通过栅栏会(在一个子线程中)执行它,但在阻塞线程被释放之前是不能执行的。
 
 
 1 public class Test {
 2     public static void main(String[] args) {
 3         CyclicBarrier barrier  = new CyclicBarrier(4);
 4         for(int i=0;i<4;i++)
 5             new Writer(barrier).start();
 6     }
 7     static class Writer extends Thread{
 8         private CyclicBarrier cyclicBarrier;
 9         public Writer(CyclicBarrier cyclicBarrier) {
10             this.cyclicBarrier = cyclicBarrier;
11         }
12  
13         @Override
14         public void run() {
15             System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
16             try {
17                 Thread.sleep(5000);      //以睡眠来模拟写入数据操作
18                 System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕");
19                 cyclicBarrier.await();
20             } catch (InterruptedException e) {
21                 e.printStackTrace();
22             }catch(BrokenBarrierException e){
23                 e.printStackTrace();
24             }
25             System.out.println("所有线程写入完毕,继续处理其他任务...");
26         }
27     }
28 }
原文地址:https://www.cnblogs.com/mengchunchen/p/9894982.html