zoukankan      html  css  js  c++  java
  • 并发(二)CyclicBarrier

    CyclicBarrier

    循环屏障,用于一组固定数目的线程互相等待。使用场景如下:

    主任务有一组串行的执行节点,每个节点之间有一批任务,固定数量的线程执行这些任务,执行完成后,在节点完成集合后,再继续执行下一批任务。

    如下图所示:

     

    屏障可以在每个节点处循环使用。构造屏障时,提供了一个可选的Runnable参数,每次执行完成后,会触发此Runnable。

        @Test
        public void test1() throws InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
    
            CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() {
                @Override
                public void run() {
                    System.out.println("所有子任务运行完成!");
                    flag.set(true);
                }
            });
    
            ExecutorService executorService = Executors.newCachedThreadPool();
    
            for(int i = 0; i < 5; i++) {
                executorService.execute(new Task(barrier));
            }
    
            while (!flag.get()) {
                Thread.sleep(100);
            }
            flag.set(false);
    
            for(int i = 0; i < 5; i++) {
                executorService.execute(new Task(barrier));
            }
    
            while (true) {
                Thread.sleep(1000);
            }
        }
    
        public static class Task implements Runnable {
    
            private CyclicBarrier barrier;
    
            public Task(CyclicBarrier barrier) {
                this.barrier = barrier;
            }
    
            @Override
            public void run() {
                try {
                    Thread.sleep((long)(Math.random()*10000));
                    System.err.println("now await nums=" + barrier.getNumberWaiting());
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }
    

     

  • 相关阅读:
    10.RobotFramework: 获取当前时间戳
    9.接口自动化-自定义关键字、接口设计规范
    8.接口自动化-RequestLibrary库的介绍与示例讲解
    7.接口自动化-环境常用库搭建
    6.数据库操作(DatabaseLibrary)与常见问题
    5.远程服务器操作(SSHLibrary)
    概率密度与概率分布函数
    Linux安装包类型
    随机变量与随机过程
    hosts文件
  • 原文地址:https://www.cnblogs.com/asfeixue/p/7910856.html
Copyright © 2011-2022 走看看