CyclicBarrier原理解析

简介:

CyclicBarrier顾名思义是循环栅栏,和CountDownLatch非常功能非常相似,它也可以实现线程间的计数等待,但是它比CountDownLatch功能更加强大:它的内存屏障可以循环使用,它可以在等待的线程被释放之后重新使用。

示例:

public class CyclicBarrierTest {
    // 创建CyclicBarrier 示例,并初始化需要等待的线程数量
    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
    public static void main(String[] args) throws InterruptedException {
        // 启动需要等待线程数量的2倍的线程,测试栅栏是否可以循环使用
        for(int i=0; i<2*3; i++){
            if (i>2){
               Thread.sleep(1000L);
            }
            new BarrierThread(i).start();
        }

    }

    static class BarrierThread extends Thread{
        int i;
        public BarrierThread(int i){
            this.i = i;
        }
        public void run() {
            try {
                System.out.println("Thread"+ i+ "在栅栏外等待。。。");
                // 阻塞当前线程,直到线程数量达到循环栅栏初始化的线程数量,否则线程一直处于等待状态
                cyclicBarrier.await();
                System.out.println("Thread"+ i + "继续执行。。。");
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

执行结果如下:
在这里插入图片描述
示例表明CyclicBarrier果然名不虚传,栅栏的确可以循环使用。线程在栅栏外等待的时候可能会抛出两个异常:BrokenBarrierException和InterruptedException,InterruptedException是线程中断异常;BrokenBarrierException是CyclicBarrier破损异常,该异常表示系统无法等到CyclicBarrier所要求的线程数量,该异常避免了其它已经到达栅栏的线程陷入无尽的等待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值