CyclicBarrier

CyclicBarrier

定义

  • ​ 循环栅栏,用来进行线程协作,等待线程满足某个计数。构造时设置『计数个数』,每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待,当等待的线程数满足『计数个数』时,继续执行
CyclicBarrier cb = new CyclicBarrier(2); // 个数为2时才会继续执行
new Thread(()->{
         System.out.println("线程1开始.."+new Date());
         try {
         cb.await(); // 当个数不足时,等待
         } catch (InterruptedException | BrokenBarrierException e) {
         e.printStackTrace();
 	}
 	System.out.println("线程1继续向下运行..."+new Date());
}).start();
new Thread(()->{
         System.out.println("线程2开始.."+new Date());
         try { Thread.sleep(2000); } catch (InterruptedException e) { }
         try {
         cb.await(); // 2 秒后,线程个数够2,继续运行
     } catch (InterruptedException | BrokenBarrierException e) {
         e.printStackTrace();
     }
 	System.out.println("线程2继续向下运行..."+new Date());
}).start();

构造

  1. ​ CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数
    量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
  2. ​ CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties,Runnable barrier-
    Action),用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景

应用

  • ​ CyclicBarrier可以用于多线程计算数据,最后合并计算结果的场景。例如,用一个Excel保
    存了用户所有银行流水,每个Sheet保存一个账户近一年的每笔银行流水,现在需要统计用户
    的日均银行流水,先用多线程处理每个sheet里的银行流水,都执行完之后,得到每个sheet的日
    均银行流水,最后,再用barrierAction用这些线程的计算结果,计算出整个Excel的日均银行流

区别

  1. ​ CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重
    置。所以CyclicBarrier能处理更为复杂的业务场景。例如,如果计算发生错误,可以重置计数
    器,并让线程重新执行一次。
  2. ​ CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得Cyclic-Barrier
    阻塞的线程数量。isBroken()方法用来了解阻塞的线程是否被中断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值