• CyclicBarrier 用法 ,汇总统计


    package net.biancheng.c.thread;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author cheng
     * @Description 统计所有线程的数字汇总
     * @Date 2022/8/29 17:29
     */
    public class Caculate {
        public static  List list = new ArrayList();
    
        public static void main(String[] args) {
            int nums = 15;
            ExecutorService executor = Executors.newFixedThreadPool(nums);
            CyclicBarrier barrier = new CyclicBarrier(nums, () -> {
                try {
                    System.out.println("Arrays.toString(list.toArray()) = " + Arrays.toString(list.toArray()));
                    Integer total = 0;
                    for (int i = 0; i < list.size(); i++) {
                        total = total + list.get(i);
                    }
                    System.out.println("total = " + total);
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            });
    
            for (int i = 0; i < nums; i++) {
                executor.submit(new Each(barrier, (i + 1)));
            }
    
            executor.shutdown();
        }
    
        static class Each implements Runnable {
            private CyclicBarrier barrier;
            private Integer nums;
            private static final ReentrantLock lock = new ReentrantLock();
    
            public Each(CyclicBarrier barrier, Integer nums) {
                this.barrier = barrier;
                this.nums = nums;
            }
    
            @Override
            public String toString() {
                return "Each{" +
                        "barrier=" + barrier +
                        ", nums=" + nums +
                        '}';
            }
    
            @Override
            public void run() {
    
                try {
                    //必须同步,不然nums可能为空;
                  /*  synchronized(Each.class){
                        list.add(nums);
                    }*/
                    lock.lock();
                    list.add(nums);
                    lock.unlock();
                    System.out.println(Thread.currentThread().getName() + ",nums = " + nums);
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    
  • 相关阅读:
    UE5、CesiumForUnreal实现瓦片坐标信息图层效果
    Thinkphp 5.0.24变量覆盖漏洞导致RCE分析
    [Kubernetes] etcd的集群基石作用
    扩展边界opencv
    系统架构设计师(第二版)学习笔记----计算机系统基础
    定时任务管理平台青龙 QingLong
    Autosar工具-Davinci Developer
    猫头虎解析:深入浅出cURL命令和HTTP请求
    如何在微信小程序中实现WebSocket连接
    玉米社:百度SEM竞价推广策略有哪些?
  • 原文地址:https://blog.csdn.net/SOMECT/article/details/126609500