CyclicBarrier 的使用案例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import static java.util.stream.Collectors.toList;
import static java.util.concurrent.ThreadLocalRandom.current;
/**

 * @desc CyclicBarrier 使用案例

 **/
public class CyclicBarrierExample
{
   public static void main(String[] args)
   {
      final int[] productsByCategoryId = getProductsByCategoryId();
      List<ProductPrice> list = Arrays.stream(productsByCategoryId).mapToObj(ProductPrice::new).collect(toList());

      // 定义“循环栅栏”
      /**
       *  构造器:
       *   public CyclicBarrier(int parties)   --》参数 : parties 代表的是“分片”,而不是“计数器”
       */
      final CyclicBarrier cyclicBarrier = new CyclicBarrier(list.size());

      // 用于存放线程任务的 List : 为后面等待所有的任务线程结束而做准备。
      final List<Thread> threadList = new ArrayList<>();

      list.forEach( pp ->
      {
         Thread thread = new Thread(() -> {
            System.out.println(pp.getProdId() + "start calculate price.");
            try
            {
               TimeUnit.SECONDS.sleep(current().nextInt(10));
               if( pp.prodId % 2 == 0)
               {
                  pp.setPrice(pp.prodId * 0.9D);
               }else
               {
                  pp.setPrice(pp.prodId * 0.71D);
               }
               System.out.println(pp.getProdId() + " -> price calculate completed.");
            }
            catch (InterruptedException e)
            {
               e.printStackTrace();
            }
            finally
            {
               try
               {
                  //在此等待其他子线程到达 barrier point
                  /**
                   *   await() 方法的作用:当前子线程的任务到达栅栏的位置,进入“阻塞状态”;直到
                   *                       其他所有的子线程都到达此位置,它们才能“退出阻塞状态”。
                   *    public int await() throws InterruptedException, BrokenBarrierException :
                   *                      该 await()  方法会返回一个 int 的值,该值所代表的意思是当前任务到达的次序。
                   */
                  cyclicBarrier.await();
               }
               catch (Exception e)
               {
                  e.printStackTrace();
               }
            }
         });
         threadList.add(thread);
         thread.start();
       });

      // 主线程等待所有任务线程结束
      threadList.forEach( t ->
      {
         try
         {
            t.join();
         }
         catch (InterruptedException e)
         {
            e.printStackTrace();
         }
      });

      System.out.println("all of prices calculate finished.");
      list.forEach(System.out::println);
   }

   private static int[] getProductsByCategoryId()
   {
      return IntStream.rangeClosed(1,10).toArray();
   }

   private static class ProductPrice
   {
      private final int prodId;
      private double price;

      private ProductPrice(int prodId)
      {
         this(prodId,-1);
      }
      private ProductPrice(int prodId,double price)
      {
         this.prodId = prodId;
         this.price = price;
      }

      public int getProdId()
      {
         return prodId;
      }

      public double getPrice()
      {
         return price;
      }

      public void setPrice(double price)
      {
         this.price = price;
      }

      @Override
      public String toString()
      {
         return "ProductPrice{" + "prodId=" + prodId + ", price=" + price + '}';
      }
   }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CyclicBarrier 是 Java 中的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个屏障点,然后再一起继续执行。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
发出的红包

打赏作者

小达人Fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值