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,直接计算和并行计算的运算时间如下:



目录
相关文章
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
415 1
|
8月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
388 1
|
9月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
423 0
|
9月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
594 16
|
10月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
10月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
423 4
|
10月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
11月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
506 14
|
11月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
513 83