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 }