• 并发(二)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();
                }
            }
        }
    

     

  • 相关阅读:
    ubuntu12.04 安装CAJViewer-ubuntu(待解决)
    ROS中遇到的一些问题和解决(更新)
    Virtualbox主机和虚拟机之间文件夹共享及双向拷贝
    Ubuntu自带截图工具screenshoot
    Ubuntu vim终端常用的快捷键
    Ubuntu终端多窗口分屏Terminator
    Apollo快速安装视频教程
    ML--XOR问题
    DL之Example1--MNIST
    Python之ML--人工神经网络识别图像
  • 原文地址:https://www.cnblogs.com/asfeixue/p/7910856.html
Copyright © 2020-2023  润新知