zoukankan      html  css  js  c++  java
  • java CyclicBarrier的介绍和使用

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

    举例说明:银行要进行账目录入,以防一个录入出现录入错误,采用两人对同一账目同时录入,以达到校对的效果

    伪代码如下:

    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    /**
     * Created by lv xiao long on 2017/7/16.
     */
    public class Work implements Runnable {
    
        private CyclicBarrier barrier;
        private String msg;
    
        public Work(String msg, CyclicBarrier  barrier){
            this.msg=msg;
            this.barrier=barrier;
        }
        public void run() {
            while (true) {
                System.out.print(msg);
                try {
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
    }
    import java.util.concurrent.CyclicBarrier;
    
    /**
     * by lv xiao long
     *
     */
    public class App 
    {
        public static void main( String[] args )
        {
            //这里设置公共屏障点为3,两个子线程都到达屏障点后,主线程在放行,进入下账目录入,所以这里设置屏障点数为3
            CyclicBarrier cyclicBarrier=new CyclicBarrier(3);
            Work work=new Work("工作人员A录入完成
    ",cyclicBarrier);
            Thread thread=new Thread(work);
            thread.start();
            work=new Work("工作人员B录入完成
    ",cyclicBarrier);
            thread=new Thread(work);
            thread.start();
            try {
                cyclicBarrier.await();
                System.out.println( "可以开始进行下一账目录入!
    " );
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    这里CycliBarrer 还有一个高级用法api如下

     /**
         * Creates a new <tt>CyclicBarrier</tt> that will trip when the
         * given number of parties (threads) are waiting upon it, and which
         * will execute the given barrier action when the barrier is tripped,
         * performed by the last thread entering the barrier.
         *
         * @param parties the number of threads that must invoke {@link #await}
         *        before the barrier is tripped
         * @param barrierAction the command to execute when the barrier is
         *        tripped, or {@code null} if there is no action
         * @throws IllegalArgumentException if {@code parties} is less than 1
         */
        public CyclicBarrier(int parties, Runnable barrierAction) {
            if (parties <= 0) throw new IllegalArgumentException();
            this.parties = parties;
            this.count = parties;
            this.barrierCommand = barrierAction;
        }

    在进行实例化的时候可以现设置一个线程 

    CyclicBarrier cyclicBarrier=new CyclicBarrier(3,work3);当所有线程达到指定屏障点后启动work3线程
  • 相关阅读:
    Python分析44130条用户观影数据,挖掘用户与电影之间的隐藏信息!
    办公利器!用Python快速将任意文件转为PDF
    教你用python搭建一个「生活常识解答」机器人
    办公利器!用Python批量识别发票并录入到Excel表格
    遇到禁止复制该怎么办?幸好我会Python...
    通知:生物信息学云论坛第十五场报告会
    centos7设置SSH安全策略–指定IP登陆
    SpringMVC—RequestMapping注解参数说明
    SpringMVC-方法四种类型返回值总结,你用过几种?
    Window下:自带python编辑器的wxpython项目发布打包exe
  • 原文地址:https://www.cnblogs.com/lvlv/p/7191200.html
Copyright © 2011-2022 走看看