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号选手 起跑!

友情链接

原文地址:https://www.cnblogs.com/huhx/p/baseusejavaCyclicBarrier.html