• CyclicBarrier开启多个线程进行计算,最后统计计算结果


    有一个大小为50000的数组,要求开启5个线程分别计算10000个元素的和,然后累加得到总和

    /**
     * 开启5个线程进行计算,最后所有的线程都计算完了再统计计算结果
     */
    public class Test5 {
    
        private static Random random = new Random();
    
        public static void main(String[] args) {
            //数组大小
            int size = 50000;
            //定义数组
            int[] numbers = new int[size];
            //随机初始化数组
            for (int i = 0; i < size; i++) {
                numbers[i] = random.nextInt(100);
            }
    
            //单线程计算结果
            Long sum = 0L;
            for (int i = 0; i < size; i++) {
                sum += numbers[i];
            }
            System.out.println("单线程计算结果:" + sum);
    
            //多线程计算结果
            //定义长度为5的数组保存每个线程的计算结果
            final int[] results = new int[5];
            //定义一个大小为5的循环栅栏,传入的runnable是当barrier触发时执行
            CyclicBarrier barrier = new CyclicBarrier(5, () -> {
                long sums = 0;
                for (int i = 0; i < 5; i++) {
                    sums += results[i];
                }
                System.out.println("多线程计算结果:" + sums);
            });
    
            //子数组长度
            int length = 10000;
            //定义五个线程去计算
            for (int i = 0; i < 5; i++) {
                //定义子数组
                int[] subNumbers = Arrays.copyOfRange(numbers, (i * length), ((i + 1) * length));
                //盛放计算结果
                int finalI = i;
                new Thread() {
                    @Override
                    public void run() {
                        for (int j = 0; j < subNumbers.length; j++) {
                            results[finalI] += subNumbers[j];
                        }
                        //等待其他线程进行计算
                        try {
                            barrier.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (BrokenBarrierException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
    
            }
    
        }
    
    }
  • 相关阅读:
    hdu 4739 Zhuge Liang's Mines DFS
    Uva 12304
    三角形的心
    最小路径覆盖的理解
    Codeforces Round #192 (Div. 2)
    Uva 11796 Dog Distance
    laravel框架session使用教程
    php session跨页面传递 session值丢失问题
    PHP 5.4中的traits特性
    PHP5.3 goto操作符介绍
  • 原文地址:https://www.cnblogs.com/moris5013/p/11871123.html
Copyright © 2020-2023  润新知