一段CyclicBarrier代码

如图所示,这是需求,下面为代码实现 

// 订单队列
Vector<P> pos;
// 派送单队列
Vector<D> dos;
// 执行回调的线程池 
Executor executor = 
  Executors.newFixedThreadPool(1);
final CyclicBarrier barrier =
  new CyclicBarrier(2, ()->{
    executor.execute(()->check());
  });
  
void check(){
  P p = pos.remove(0);
  D d = dos.remove(0);
  // 执行对账操作
  diff = check(p, d);
  // 差异写入差异库
  save(diff);
}
  
void checkAll(){
  // 循环查询订单库
  Thread T1 = new Thread(()->{
    while(存在未对账订单){
      // 查询订单库
      pos.add(getPOrders());
      // 等待
      barrier.await();
    }
  });
  T1.start();  
  // 循环查询运单库
  Thread T2 = new Thread(()->{
    while(存在未对账订单){
      // 查询运单库
      dos.add(getDOrders());
      // 等待
      barrier.await();
    }
  });
  T2.start();
}

CyclicBarrier的构造函数中能否不用线程池,之间调用回调函数?

可以,此时的回调函数会运行在最后await()线程之上,此时的问题就是下次的get()得等回调函数的执行完。

如果利用线程池则不需要等待回调函数执行完,实现了异步。

那么线程池的大小能否改为大于1的数?

不可以,只有单线程去取俩个队列中的数据才不会出错。

举个例子   第一个回调函数执行第一个队列的remove(0),第二个回调函数后来居上执行完第一个队列的remove(0),抢在了第一个回调函数前面执行 第二个队列的remove(0),那么此时俩个回调函数获取到的值并不是一一对应。

所以将线程池的大小设置为1,保证了回调函数执行的串行化。

### CyclicBarrier 的 Java 用法与示例代码 `CyclicBarrier` 是 Java 并发包中的一种同步工具,用于协调多个线程之间的协作。它允许一组线程互相等待,直到所有线程都到达一个屏障点,然后继续执行[^4]。 以下是一个典型的 `CyclicBarrier` 示例代码,展示了如何使用它来实现多线程协作任务: ```java import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierExample { public static void main(String[] args) { final int numberOfThreads = 5; // 定义参与的线程数 CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> { System.out.println("所有线程已准备好,开始计算..."); }); // 创建 CyclicBarrier,并设置当所有线程到达时执行的命令 for (int i = 0; i < numberOfThreads; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + " 正在准备..."); Thread.sleep((long) (Math.random() * 1000)); // 模拟准备时间 System.out.println(Thread.currentThread().getName() + " 准备完毕,等待其他线程..."); barrier.await(); // 等待所有线程到达屏障点 System.out.println(Thread.currentThread().getName() + " 继续执行..."); } catch (InterruptedException | BrokenBarrierException e) { Thread.currentThread().interrupt(); System.err.println("线程中断:" + e.getMessage()); } }).start(); } } } ``` #### 代码解析 - **CyclicBarrier 构造函数**:`CyclicBarrier(int parties, Runnable barrierAction)` 中的 `parties` 参数指定了需要等待的线程数量,`barrierAction` 是当所有线程到达屏障点后执行的回调操作[^3]。 - **await 方法**:每个线程调用 `barrier.await()` 表示到达屏障点并等待其他线程。只有当指定数量的线程都调用了 `await` 方法后,屏障才会释放所有线程[^2]。 - **异常处理**:如果某个线程在等待期间被中断或超时,屏障会被打破,其他线程会抛出 `BrokenBarrierException`。 ### 使用场景 1. **多线程协作计算**:例如矩阵运算中每行计算完成后的汇总。 2. **分阶段任务**:任务分为多个阶段,每阶段需所有线程完成。 3. **性能测试**:模拟多个线程同时开始执行的压力测试[^4]。 ### 注意事项 - 调用 `await()` 的线程数必须等于构造函数中指定的 `parties` 数量,否则可能导致死锁。 - 如果某线程因中断或超时退出,屏障会“打破”,其他线程将抛出 `BrokenBarrierException`[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值