并发编程

CyclicBarrier并发工具类

2019-06-27  本文已影响9人  xiaolyuh

作用

让一 组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开放,所有被屏障拦截的线程才会继续运行。

核心方法

应用场景

CyclicBarrier可以用于多线程计算数据,最后合并计算结果的场景。

示例

package com.xiaolyuh;

import com.alibaba.fastjson.JSON;

import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrier并发工具类
 *
 * @author yuhao.wang3
 * @since 2019/6/27 15:52
 */
public class CyclicBarrierTest {

    public static void main(String[] args) {
        Random random = new Random();
        Map<String, Long> map = new ConcurrentHashMap<>();
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4, () -> {
            System.out.println(Thread.currentThread().getName() + "  3所有线程到达屏障的时候,优先执行barrierAction线程。。。。。。。");
            System.out.println(Thread.currentThread().getName() + "  3" + JSON.toJSONString(map));
        });

        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(200 + random.nextInt(200));
                    System.out.println(Thread.currentThread().getName() + "  1等待所有线程到达屏障------------");
                    map.put(Thread.currentThread().getName(), Thread.currentThread().getId());
                    cyclicBarrier.await();
                    System.out.println(Thread.currentThread().getName() + "  2所有线程到达屏障的时候,开始执行业务代码================");
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }).start();
        }

        try {
            cyclicBarrier.await();
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + "  主线程完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果:

Thread-1  1等待所有线程到达屏障------------
Thread-0  1等待所有线程到达屏障------------
Thread-2  1等待所有线程到达屏障------------
Thread-2  3所有线程到达屏障的时候,优先执行barrierAction线程。。。。。。。
Thread-2  3{"Thread-0":13,"Thread-1":14,"Thread-2":15}
Thread-2  2所有线程到达屏障的时候,开始执行业务代码================
Thread-1  2所有线程到达屏障的时候,开始执行业务代码================
Thread-0  2所有线程到达屏障的时候,开始执行业务代码================
main  主线程完成

参考

《java并发编程的艺术》

源码

https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-concurrent 工程

layering-cache

为监控而生的多级缓存框架 layering-cache这是我开源的一个多级缓存框架的实现,如果有兴趣可以看一下

上一篇 下一篇

猜你喜欢

热点阅读