• Java之CyclicBarrier使用


    http://blog.csdn.net/shihuacai/article/details/8856407

    1、类说明:

    一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

    2、使用场景:

    需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。

    3、常用方法:

    await

    public int await()
              throws InterruptedException,
                     BrokenBarrierException
    在所有参与者都已经在此 barrier 上调用 await方法之前,将一直等待。如果当前线程不是将到达的最后一个线程,出于调度目的,将禁用它,且在发生以下情况之一前,该线程将一直处于休眠状态:
    • 最后一个线程到达;或者
    • 其他某个线程中断当前线程;或者
    • 其他某个线程中断另一个等待线程;或者
    • 其他某个线程在等待 barrier 时超时;或者
    • 其他某个线程在此 barrier 上调用 reset()

    如果当前线程:

    • 在进入此方法时已经设置了该线程的中断状态;或者
    • 在等待时被中断

    则抛出 InterruptedException,并且清除当前线程的已中断状态。如果在线程处于等待状态时 barrier 被 reset(),或者在调用 await 时 barrier 被损坏,抑或任意一个线程正处于等待状态,则抛出 BrokenBarrierException 异常。

    如果任何线程在等待时被 中断,则其他所有等待线程都将抛出 BrokenBarrierException 异常,并将 barrier 置于损坏状态。

    如果当前线程是最后一个将要到达的线程,并且构造方法中提供了一个非空的屏障操作,则在允许其他线程继续运行之前,当前线程将运行该操作。如果在执行屏障操作过程中发生异常,则该异常将传播到当前线程中,并将 barrier 置于损坏状态。

    返回:
    到达的当前线程的索引,其中,索引 getParties() - 1 指示将到达的第一个线程,零指示最后一个到达的线程
    抛出:
    InterruptedException - 如果当前线程在等待时被中断
    BrokenBarrierException - 如果另一个 线程在当前线程等待时被中断或超时,或者重置了 barrier,或者在调用 await 时 barrier 被损坏,抑或由于异常而导致屏障操作(如果存在)失败。
    4、相关实例

    赛跑时,等待所有人都准备好时,才起跑:

    [java] view plain copy
     
    1. public class CyclicBarrierTest {  
    2.   
    3.     public static void main(String[] args) throws IOException, InterruptedException {  
    4.         //如果将参数改为4,但是下面只加入了3个选手,这永远等待下去  
    5.         //Waits until all parties have invoked await on this barrier.   
    6.         CyclicBarrier barrier = new CyclicBarrier(3);  
    7.   
    8.         ExecutorService executor = Executors.newFixedThreadPool(3);  
    9.         executor.submit(new Thread(new Runner(barrier, "1号选手")));  
    10.         executor.submit(new Thread(new Runner(barrier, "2号选手")));  
    11.         executor.submit(new Thread(new Runner(barrier, "3号选手")));  
    12.   
    13.         executor.shutdown();  
    14.     }  
    15. }  
    16.   
    17. class Runner implements Runnable {  
    18.     // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)  
    19.     private CyclicBarrier barrier;  
    20.   
    21.     private String name;  
    22.   
    23.     public Runner(CyclicBarrier barrier, String name) {  
    24.         super();  
    25.         this.barrier = barrier;  
    26.         this.name = name;  
    27.     }  
    28.   
    29.     @Override  
    30.     public void run() {  
    31.         try {  
    32.             Thread.sleep(1000 * (new Random()).nextInt(8));  
    33.             System.out.println(name + " 准备好了...");  
    34.             // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。  
    35.             barrier.await();  
    36.         } catch (InterruptedException e) {  
    37.             e.printStackTrace();  
    38.         } catch (BrokenBarrierException e) {  
    39.             e.printStackTrace();  
    40.         }  
    41.         System.out.println(name + " 起跑!");  
    42.     }  
    43. }  
     


    输出结果:
    3号选手 准备好了...
    2号选手 准备好了...
    1号选手 准备好了...
    1号选手 起跑!
    2号选手 起跑!
    3号选手 起跑!
    
    转载地址:http://www.itzhai.com/the-introduction-and-use-of-cyclicbarrier.html
  • 相关阅读:
    【数据结构】线性表&&顺序表详解和代码实例
    【智能算法】超详细的遗传算法(Genetic Algorithm)解析和TSP求解代码详解
    【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
    【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解
    10. js时间格式转换
    2. 解决svn working copy locked问题
    1. easyui tree 初始化的两种方式
    10. js截取最后一个斜杠后面的字符串
    2. apache整合tomcat部署集群
    1. apache如何启动
  • 原文地址:https://www.cnblogs.com/ydxblog/p/7991869.html
Copyright © 2020-2023  润新知