Java高并发--循环栅栏(CyclicBarrier)

149 阅读1分钟

循环栅栏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();
        }
    }
}