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



目录
相关文章
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
527 4
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
586 0
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
607 14
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
932 5
|
监控 搜索推荐 Java
Java 多线程最新实操技术与应用场景全解析:从基础到进阶
本文深入探讨了Java多线程的现代并发编程技术,涵盖Java 8+新特性,如CompletableFuture异步处理、Stream并行流操作,以及Reactive编程中的Reactor框架。通过具体代码示例,讲解了异步任务组合、并行流优化及响应式编程的核心概念(Flux与Mono)。同时对比了同步、CompletableFuture和Reactor三种实现方式的性能,并总结了最佳实践,帮助开发者构建高效、扩展性强的应用。资源地址:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
739 3
|
存储 Java 索引
java 数组
在 Java 中,数组是一种数据结构,用于存储多个相同类型的数据元素。数组的大小一旦创建后就不能改变,因此它是固定长度的。Java 数组是一种 对象,即使它存储的值是基本类型(如 int、double 等),它也是一个对象引用。
327 0
|
算法 Java 调度
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
272 1

热门文章

最新文章