java多线程并行计算求数组和

简介: java多线程并行计算求数组和

问题

当面临一个大数组时,要加快数组求和的速度,是否可以将大数组分拆成多个小数组,然后让cpu的多个线程一起执行计算,以加快计算的速度?


代码

package com.dam.mutiThread.calculateSum;
import java.util.Random;
public class CalculateSum {
    //嵌套循环次数,用来增加计算量,更大幅度地体现直接计算和并行计算的区别
    private static int cycleTime=10;
    public static void main(String[] args) {
        //随机生成一个数组
        long[] array = getArray(99999999);
        System.out.println("直接计算----------------------------------------------------------");
        long start = System.currentTimeMillis();
        long sum1 = 0;
        for (long l : array) {
            sum1 += l;
            int test = 0;
            for (int j = 0; j < cycleTime; j++) {
                for (int k = 0; k < cycleTime; k++) {
                    test++;
                }
            }
        }
        System.out.println("结果:" + sum1);
        System.out.println("计算时间:" + (System.currentTimeMillis() - start) + "ms");
        System.out.println();
        System.out.println("并行计算----------------------------------------------------------");
        start = System.currentTimeMillis();
        long sum2 = new CalculateSum().createThread(4, array);
        System.out.println("结果:" + sum2);
        System.out.println("计算时间:" + (System.currentTimeMillis() - start) + "ms");
    }
    /**
     * 随机生成数组
     * @param size
     * @return
     */
    private static long[] getArray(int size) {
        long[] array = new long[size];
        for (int i = 0; i < array.length; i++) {
            array[i] = new Random().nextInt(20) - 10;
        }
        return array;
    }
    /**
     * 将数组拆分成threadCount个小组,给不同的线程计算
     * @param threadCount
     * @param arr
     * @return
     */
    private long createThread(int threadCount, long[] arr) {
        long sum = 0;
        int memberNumOfGroup = arr.length / threadCount;
        int start = 0;
        int end = memberNumOfGroup - 1;
        SumThread[] threads = new SumThread[threadCount];
        //准备线程
        for (int i = 0; i < threadCount; i++) {
            System.out.println("start:" + start + ",end:" + end);
            threads[i] = new SumThread(start, end, arr);
            start = end + 1;
            if (i == threadCount - 2) {
                end = arr.length - 1;
            } else {
                end += memberNumOfGroup;
            }
        }
        //启动线程
        for (int i = 0; i < threadCount; i++) {
            threads[i].start();
        }
        try {
            for (int i = 0; i < threadCount; i++) {
                //等待多线程计算,获取计算结果
                threads[i].join();
                sum += threads[i].getResult();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return sum;
    }
    /**
     * 计算所拆分的小组的数值之和
     */
    class SumThread extends Thread {
        private long result; //记录当前线程计算的结果
        private int start; //开始计算的项
        private int end; //项数间隔
        private long[] arr;
        public SumThread(int start, int end, long[] arr) {
            this.start = start;
            this.end = end;
            this.arr = arr;
        }
        @Override
        public void run() {
            this.result = 0;
            for (int i = this.start; i <= this.end; i++) {
                this.result += this.arr[i];
                int test = 0;
                for (int j = 0; j < cycleTime; j++) {
                    for (int k = 0; k < cycleTime; k++) {
                        test++;
                    }
                }
            }
        }
        /**
         * 取出该线程计算的结果
         *
         * @return
         */
        public double getResult() {
            return result;
        }
    }
}


结果

在计算时,设置了线程数为4,直接计算和并行计算的运算时间如下:



目录
相关文章
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
316 1
|
7月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
7月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
288 0
|
7月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
472 16
|
8月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
算法 Java
JAVA并发处理经验(四)并行模式与算法2:Future模式
一、前言 首先我举个例子说明一下: 你(client)要去海南的亲戚家里玩耍,你叫爸爸给你海南的二叔打电话告诉他你周六晚上8点得飞机到海南(call1只是通知),你真倒海南你二叔接到你了旅...
1134 0
|
8月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践