• java高级---->Thread之CyclicBarrier的使用


      CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。今天我们就学习一下CyclicBarrier的用法。

    CyclicBarrier的简单使用

      类CyclicBarrier不仅有CountDownLatch所具有的功能,还可以实现屏障等待的功能,也就是阶段性同步,它在使用上的意义在于可以循环地实现线程要一起做任务的目标,而不是像类CountDownLatch一样,仅仅支持一次线程与同步点阻塞的特性。

    关于CyclicBarrier常用的方法的介绍:

    package com.linux.huhx.concurreny;
    
    import java.io.IOException;
    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class CyclicBarrierTest1 {
        public static void main(String[] args) throws IOException, InterruptedException {
            /**
             * 1、如果参数>3的话,三个线程的await执行完,parties只能加到3。那么子线程await后续的方法就不能执行
             * 2、如果参数=3的话,三个线程的await执行完,parties能加到3。所以子线程await后续的方法能执行
             * 3、如果参数<3的话,当第二个线程await执行完之后,parties加到了2。??????
             */
            CyclicBarrier barrier = new CyclicBarrier(3);
    
            ExecutorService executor = Executors.newFixedThreadPool(3);
            executor.submit(new Thread(new Runner(barrier, "1号选手")));
            executor.submit(new Thread(new Runner(barrier, "2号选手")));
            executor.submit(new Thread(new Runner(barrier, "3号选手")));
            Thread.sleep(200);
            System.out.println("in main method after");
    
            executor.shutdown();
        }
    
        public static class Runner implements Runnable {
            // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
            private CyclicBarrier barrier;
            private String name;
    
            public Runner(CyclicBarrier barrier, String name) {
                super();
                this.barrier = barrier;
                this.name = name;
            }
            @Override
            public void run() {
                try {
                    Thread.sleep(new Random().nextInt(1000));
                    System.out.println(name + " 准备好了...");
                    // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(name + " 起跑!");
            }
        }
    }

    运行的结果如下:执行的结果不固定

    in main method after
    2号选手 准备好了...
    1号选手 准备好了...
    3号选手 准备好了...
    2号选手 起跑!
    1号选手 起跑!
    3号选手 起跑!

    友情链接

  • 相关阅读:
    Selenium 元素定位方法小结
    java OpenCV挑战极验滑动拼图验证码
    使用java + selenium + OpenCV破解腾讯防水墙滑动验证码
    Java轻松破解顶象滑动拼图验证码
    Java中的chromedriver把Selenium的焦点转移到新窗口
    java 破解滑动拼图验证码(opencv+chromedriver+selenium )
    selenium+java破解极验滑块验证码
    Appium 本地编译 chromedriver 历程记录
    关闭 ChromeDriver was started successfully 提示信息
    Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版)
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavaCyclicBarrier.html
Copyright © 2020-2023  润新知