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();
                }
            }
        }
    

     

  • 相关阅读:
    每天学习一个设计模式(十二):创建型之单例模式
    每天学习一个设计模式(十一):创建型之原型模式
    每天学习一个设计模式(十):创建型之工厂方法模式
    每天学习一个设计模式(九):创建型之建造者模式
    数据库
    操作系统
    计算机网络
    Java 基础知识
    Linux基本操作
    git 基本操作
  • 原文地址:https://www.cnblogs.com/asfeixue/p/7910856.html
Copyright © 2011-2022 走看看