zoukankan      html  css  js  c++  java
  • 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号选手 起跑!

    友情链接

  • 相关阅读:
    priority of uncertainty
    0523
    6.  Design Partition Guidelines for ThirdParty IP Delivery
    0604
    the categories of constraints
    priority of setup/hold
    SECTION 4: THE TIMEQUEST GUI
    tiny mistake made confusing issues
    fgetcsv 读取csv文件出现问题解决办法
    安卓笔记之配置第一个程序
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavaCyclicBarrier.html
Copyright © 2011-2022 走看看