多线程之回环栅栏 CyclicBarrier 的使用

本贴最后更新于 2049 天前,其中的信息可能已经事过境迁

场景定义

假设有一个场景,有一场百米赛跑运动会,在三名选手都跑完之后,要求算出所有人的平均成绩。那么就可以用到 CyclicBarrier 了。

要求 1.所有人跑完之后才能计算平均值。

要求 2.计算平均值用多线程运算(因为换成三亿人进行赛跑时也适用)

public class CyclicBarrier1 implements Runnable{

    //创建初始化3个线程的线程池
    private ExecutorService threadPool =Executors.newFixedThreadPool(3);

    //创建3个CyclicBarrier对象,执行完后执行当前类的run方法
    CyclicBarrier cb = new CyclicBarrier(3,this);

    //保存三组随机数的平均值
    private ConcurrentHashMap<String, Integer> map=new ConcurrentHashMap<String,Integer>();

    //计算三组随机数的平均值
    public void count(){
        for (int i = 0; i < 3; i++) {
            threadPool.execute(() -> {
                //生成三个数,取值范围1-10
                int random1 = (int)(Math.random()*10)+1;
                int random2 = (int)(Math.random()*10)+1;
                int random3 = (int)(Math.random()*10)+1;
                int average = (random1+random2+random3)/3;
                map.put(Thread.currentThread().getName(),average);
                System.out.println(Thread.currentThread().getName()+"的平均数为"+average);
                try {
                    cb.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    @Override
    public void run() {
        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
        double add = 0;
        while(iterator.hasNext()) {
            Map.Entry<String, Integer> next = iterator.next();
            String key=next.getKey();
            int value=next.getValue();
            add += value;
            System.out.println(key+" "+value);
        }
        add /=3;
        System.out.println("三组平均数为:"+add);
        threadPool.shutdownNow();
    }

    public static void main(String[] args) {
        CyclicBarrier1 cb=new CyclicBarrier1();
        cb.count();
    }
}

方法简介

CyclicBarrier 有两个构造函数:

    CyclicBarrier(int parties): int 类型的参数表示有几个线程来参与这个屏障拦截

    CyclicBarrier(int parties,Runnable barrierAction): 当所有线程到达一个屏障点时,优先执行 barrierAction 这个线程的 run().

    await(): 每个线程调用 await(),表示我已经到达屏障点,然后当前线程被阻塞

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...