循环栅栏CyclicBarrier
CyclicBarrier是另外一种多线程并发控制行工具,与CountDownLatch非常相似,功能会比CountDownLatch更加复杂。
这里举例一个它可以适用的场景:司令下达命令,要求10个士兵一起完成一项任务。这时要求10个士兵先集合报到,在一起去执行任务。当士兵把自己手头上的任务都执行完了,那么司令才能宣布任务完成。
主要的方法有:
await()在所有的参与者都已经在此barrier上调用await方法之前一直等待。
它可能会抛出两个异常,一个是InterruptException,也就是在等待过程中,线程被中断,另一个异常是它特有的BrokenBarrierException,一旦遇到这个异常,则表示当前的CyclicBarrier已经破损了,可能系统已经没有办法等待所有线程到齐了。如果继续等待,可能会白白消耗时间。
使用案例:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
//创建固定值
private static final int NUMBER = 7;
public static void main(String[] args) {
//创建CyclicBarrier
CyclicBarrier cyclicBarrier =
new CyclicBarrier(NUMBER,()->{
System.out.println("*****集齐7颗龙珠就可以召唤神龙");
});
//集齐七颗龙珠过程
for (int i = 1; i <=7; i++) {
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+" 星龙被收集到了");
//等待
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}