CyclicBarrier类一段小代码的赏析

本文介绍了如何使用try-finally结构结合布尔标识ranAction来确保在运行某个命令时,即使发生异常也能执行特定的操作,并且不阻碍异常的正常抛出。这种做法避免了传统try-catch块中异常处理与特定业务逻辑混杂的问题,提供了一种更清晰的错误处理方式。
              boolean ranAction = false;
               try {
                    final Runnable command = barrierCommand;
                    if (command != null)
                         command.run();
                   ranAction = true;
                   nextGeneration();
                   return 0;
               } finally {
                   if (!ranAction)//通过“try-finally和ranAction布尔标识”,做到这样的效果:如果command.run();抛出异常,则执行 breakBarrier(),但不阻碍异常的如常抛出
                       breakBarrier();
               }

 

这里的技巧是: 通过“try-finally和ranAction布尔标识”,做到这样的效果:如果command.run();抛出异常,则执行 breakBarrier(),但不阻碍异常的如常抛出。


如果不这样做,比较一般的做法是:

try{

     command.run();

     ......

}catch(Throwable e){

     breakBarrier();

     throw e; //或throw new RuntimeException(e.getMessage(), e.getCause() );

}

CyclicBarrierJava 中的一个同步工具,它允许一组线程互相等待,直到所有线程都到达某个屏障点,然后再一起继续执行。CyclicBarrier 可以循环使用,因此称之为循环屏障。 下面是 CyclicBarrier 工具的基本使用示例: ```java import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo { public static void main(String[] args) { // 创建一个 CyclicBarrier 实例,指定等待线程数和屏障动作 CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> { System.out.println("所有线程已到达屏障点,开始执行屏障动作"); }); // 创建 3 个线程,模拟多个线程同时到达屏障点 for (int i = 0; i < 3; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + " 已到达屏障点,等待其他线程"); cyclicBarrier.await(); // 等待其他线程到达屏障点 System.out.println(Thread.currentThread().getName() + " 继续执行"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }).start(); } } } ``` 上述代码中,我们创建了一个 CyclicBarrier 实例,指定等待线程数和屏障动作。然后创建了 3 个线程,模拟多个线程同时到达屏障点,每个线程到达屏障点后等待其他线程,直到所有线程到达屏障点,才会继续执行。 在 CyclicBarrier 的构造函数中,我们指定了等待线程数为 3,也就是说,只有当 3 个线程都到达屏障点时,才会执行屏障动作。屏障动作是一个 Runnable 对象,它会在所有线程到达屏障点后执行一次。 在每个线程执行的代码中,我们调用了 CyclicBarrier 的 await() 方法,等待其他线程到达屏障点。当所有线程都到达屏障点后,await() 方法会返回,线程继续执行。 需要注意的是,CyclicBarrier 的 await() 方法可能会抛出 InterruptedException 和 BrokenBarrierException 异常,因此需要在 catch 块中处理这两个异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值