栅栏屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程 到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线 程数量,每个线程调用await方法告CyclicBarrier我已经到达了屏障,然后当前线程被阻塞
方法:
cyclicBarrier.await()
应用场景:
可以用于多线程计算数据,最后合并计算结果的场景。例如,用一个Excel保存了用户 所有银行流水,每个Sheet保存一个账户近一年的每笔银行流水,现在需要统计用户的日均 银行流水,先用多线程处理每个sheet里的银行流水,都执行完之后,得到每个sheet的日均银行流水,最后,再用barrierAction用这些线程的计算结果,计算出整个Excel的日 均银行流水
示例代码:
/**
* @author qy
* @date 2019/8/23 14:46
* @description
*/
public class CyclicBarrierTest implements Runnable {
private CyclicBarrier cyclicBarrier;
private int index;
public CyclicBarrierTest(CyclicBarrier cyclicBarrier, int index) {
this.cyclicBarrier = cyclicBarrier;
this.index = index;
}
public void run() {
try {
System.out.println("index:" + index);
index--;
cyclicBarrier.await();
} catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
CyclicBarrier cyclicBarrier = new CyclicBarrier(11, new Runnable() {
public void run() {
System.out.println("所有特工到达屏障,准备开始执行秘密任务");
}
});
for (int i = 0; i < 10; i++) {
new Thread(new CyclicBarrierTest(cyclicBarrier, i)).start();
}
cyclicBarrier.await();
System.out.println("全部到达屏障....");
}
}
结果:
index:1
index:2
index:0
index:3
index:4
index:8
index:6
index:7
index:9
index:5
所有特工到达屏障,准备开始执行秘密任 务
全部到达屏障....
网友评论