CyclicBarrier改善CountDownLatch循环重入

CyclicBarrier

跟CountDOwnLatch非常类似,也是计时结束执行。

  • 区别就是可以重用,也就是基数可以回到初始值。用完了不需要重新创建对象。

  • 谁调用await就阻塞谁,这个能阻塞多个,countdownlatch只能阻塞一个。

  • 变为0之后 再次调用await 又会回到初始化的值

基本使用

CyclicBarrier:循环栅栏(屏障),用来进行线程协作,等待线程满足某个计数,才能触发自己执行

常用方法:

  • public CyclicBarrier(int parties, Runnable barrierAction):用于在线程到达屏障 parties 时,执行 barrierAction

    • parties:代表多少个线程到达屏障开始触发线程任务

    • barrierAction:线程任务(基数为0的执行方法

  • public int await():线程调用 await 方法通知 CyclicBarrier 本线程已经到达屏障【基数不为0不会向下进行】

与 CountDownLatch 的区别:CyclicBarrier 是可以重用的

应用:可以实现多线程中,某个任务在等待其他线程执行完毕以后触发

  • 注意:线程数要和基数保持一致,否则可能时两个线task1完成。因为submit在for循环中。第二次循环线程池还有线程的话可以去竞争。

 public static void main(String[] args) {
     ExecutorService service = Executors.newFixedThreadPool(2);
     CyclicBarrier barrier = new CyclicBarrier(2, () -> {
         System.out.println("task1 task2 finish...");
     });
 ​
     for (int i = 0; i < 3; i++) { /// 循环重用
         service.submit(() -> {
             System.out.println("task1 begin...");
             try {
                 Thread.sleep(1000);
                 barrier.await();    // 2 - 1 = 1
             } catch (InterruptedException | BrokenBarrierException e) {
                 e.printStackTrace();
             }
         });
 ​
         service.submit(() -> {
             System.out.println("task2 begin...");
             try {
                 Thread.sleep(2000);
                 barrier.await();    // 1 - 1 = 0
             } catch (InterruptedException | BrokenBarrierException e) {
                 e.printStackTrace();
             }
         });
     }
     service.shutdown();
 }
  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值