美文网首页并发编程
CyclicBarrier并发工具类

CyclicBarrier并发工具类

作者: xiaolyuh | 来源:发表于2019-06-27 16:30 被阅读9次

作用

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

核心方法

  • CyclicBarrier(int parties):默认构造方法,parties参数表示屏障拦截的线程数量
  • CyclicBarrier(int parties, Runnable barrierAction):barrierAction表示屏障开放的时候会优先执行barrierAction线程,会直接使用最后到达屏障的那个线程来执行barrierAction。
  • await():告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞,直到所有线程到达屏障后,屏障开放一起执行
  • reset():重置计数器
  • getNumberWaiting方法可以获得Cyclic-Barrier 阻塞的线程数量
  • isBroken()方法用来了解阻塞的线程是否被中断

应用场景

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这是我开源的一个多级缓存框架的实现,如果有兴趣可以看一下

相关文章

网友评论

    本文标题:CyclicBarrier并发工具类

    本文链接:https://www.haomeiwen.com/subject/dijrcctx.html