zoukankan      html  css  js  c++  java
  • 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();
    
            }
    
        }
    
    }
  • 相关阅读:
    移动比联通强的帖子的再次探讨
    清除或选中所有的checkbox
    textbox获得焦点显示JS日历控件
    Repeater分页
    互联网协会:博客推行实名制已成定局
    新闻内容分页
    获得显示器设置的分辨率
    node.js应用生成windows server的plugin——winser
    CSS基础
    git使用
  • 原文地址:https://www.cnblogs.com/moris5013/p/11871123.html
Copyright © 2011-2022 走看看