CyclicBarrier是juc包里的一个工具类,它能实现的功能是:每当执行了指定次数的倍数的await方法后就会唤醒所有因调用cyclicBarrier.await而阻塞的线程,并触发指定事件
CyclicBarrier应用小demo
场景:现在有14个线程准备参加体育课考试,要求分成两波考试,先到达考场的7个人组成一波参加考试,后面剩余的再组成一波参加考试
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
System.out.println("开始考试。。。");
});
for(int i = 0; i < 14; i++) {
int ii = i + 1;
new Thread(()->{
System.out.println("线程" + ii + "到达了考场");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}, "线程" + ii).start();
}
}
执行结果
线程1到达了考场
线程3到达了考场
线程5到达了考场
线程4到达了考场
线程6到达了考场
线程7到达了考场
线程9到达了考场
开始考试。。。
线程12到达了考场
线程13到达了考场
线程2到达了考场
线程8到达了考场
线程14到达了考场
线程11到达了考场
线程10到达了考场
开始考试。。。