Java并发工具类 - CyclicBarrier

2019-03-07  本文已影响0人  怡红快绿

一、CyclicBarrier是什么

CyclicBarrier指的就是 循环屏障,虽然这个叫法很奇怪,但是确能很好地表示它的作用。

其作用在JDK注释中是这样描述的:

A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other.
The barrier is called cyclic because it can be re-used after the waiting threads are released.

CyclicBarrier是一个同步辅助类,它允许一组线程相互等待直到所有线程都到达一个公共的屏障点。
在程序中有固定数量的线程,这些线程有时候必须等待彼此,这种情况下,使用CyclicBarrier很有帮助。
这个屏障之所以用循环修饰,是因为在所有的线程释放彼此之后,这个屏障是可以重新使用的。

CyclicBarrier的简单理解

其实,我更喜欢[人满发车]这个词来理解CyclicBarrier的作用:

  1. 长途汽车站提供长途客运服务。
  2. 当等待坐车的乘客到达20人时,汽车站就会发出一辆长途汽车,让这20个乘客上车走人。
  3. 等到下次等待的乘客又到达20人是,汽车站就会又发出一辆长途汽车。

二、主要方法

三、模拟多线程分组计算

实现方式:
  1. 用3个线程分别计算:定义一个大小为3的线程池。
  2. 计算结果进行合并:定义一个屏障线程,将上面3个线程计算的子结果信息合并。
代码:
final CyclicBarrier barrier2 = new CyclicBarrier(3, new Runnable() {
    @Override
    public void run() {
        //汇总结果
        System.out.println("开始汇总计算结果");
    }
});
final ExecutorService executorService2 = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
    final int finalI = i;
    executorService2.submit(
            new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("线程 "+ finalI +" 开始计算…计算完成");
                        barrier2.await();
                    } catch (InterruptedException | BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            });
}

以下是完整代码
public static void main(String... args) {
    final CyclicBarrier barrier2 = new CyclicBarrier(3, new Runnable() {
        @Override
        public void run() {
            //汇总结果
            System.out.println("开始汇总计算结果……汇总完成");
        }
    });
    final ExecutorService executorService2 = Executors.newFixedThreadPool(3);
    for (int i = 0; i < 3; i++) {
        final int finalI = i;
        executorService2.submit(
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            System.out.println("线程 " + finalI + " 开始计算…计算完成");
                            barrier2.await();
                        } catch (InterruptedException | BrokenBarrierException e) {
                            e.printStackTrace();
                        }
                    }
                });
    }
  //最后记得要关闭线程池
    executorService2.shutdown();
}
运行结果

线程 0 开始计算…计算完成
线程 2 开始计算…计算完成
线程 1 开始计算…计算完成
开始汇总计算结果……汇总完成


原文链接:https://blog.csdn.net/hanchao5272/article/details/79779639

上一篇 下一篇

猜你喜欢

热点阅读