forkjoin原理_java forkjoinpool

forkjoin原理_java forkjoinpool要求一个数组内有10万个30左右的数值(非零),要求计算这些值的乘积。-时间要求:2s-堆内存大小:4m实现方案通过ForkJoin实现。代码实现importcom.google.common.base.Joiner;importcom.google.common.base.Splitter;importorg.apache.commons.l…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

要求

一个数组内有10万个30左右的数值(非零),要求计算这些值的乘积。
– 时间要求:2s
– 堆内存大小:4m

实现方案

通过ForkJoin实现。

代码实现

import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.apache.commons.lang3.RandomUtils;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/** * 一个数组内有10万个30左右的数值(非零),要求计算这些值的乘积。 * 时间要求:2s * 堆内存大小:4m * <p> * 实现方案:通过ForkJoin实现。 */
public class ForkJoinMultiply extends RecursiveTask<BigInteger> {
    private int[] numbers;
    private static final int THREASHOLD = 10000;
    private static final int MAX_SIZE = 100000;

    public ForkJoinMultiply(int[] numbers) {
        this.numbers = numbers;
    }

    @Override
    protected BigInteger compute() {
        if(numbers.length<=THREASHOLD){
  
  //如果数组容量小于阈值,直接计算乘积。
            BigInteger result = BigInteger.ONE;
            for(int i = 0;i<numbers.length;i++){
                result = result.multiply(new BigInteger(String.valueOf(numbers[i])));
            }
            return result;
        }else {
  
  //如果容量大于阈值,则分组计算。分成两组
            int middle = numbers.length/2;
            int[] left = Arrays.copyOfRange(numbers,0,middle);
            int[] right = Arrays.copyOfRange(numbers,middle,numbers.length);
            ForkJoinMultiply leftTask = new ForkJoinMultiply(left);
            ForkJoinMultiply rightTask = new ForkJoinMultiply(right);
            leftTask.fork();
            rightTask.fork();
            return leftTask.join().multiply(rightTask.join());
        }
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        BigInteger temp = BigInteger.ONE;
        int[] numbers = new int[MAX_SIZE];
        for(int i = 0;i<MAX_SIZE;i++){
            int randomNumber = RandomUtils.nextInt(20,40);
            temp = temp.multiply(BigInteger.valueOf(randomNumber));
            numbers[i] = randomNumber;
        }
        System.out.println("multiply result is "+temp+", cost time "+(System.currentTimeMillis()-start));

        start = System.currentTimeMillis();
        // 执行ForkJoin需要用到ForkJoinPool,调用commonPool方法是JDK1.8的实现
        ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();
        ForkJoinMultiply multiply = new ForkJoinMultiply(numbers);
        BigInteger result = forkJoinPool.invoke(multiply);
        System.out.println("forkjoin multiply result is "+result+", cost time "+(System.currentTimeMillis()-start));
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191639.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一些常用单位之间的换算

    一些常用单位之间的换算一些常用单位之间的换算单位表格汇总单位表格汇总请注意下方的表格:目前只对链接(也就是文字颜色有变换的那个)产生了单位的换算,其他的没有做换算,如果有清楚的可以在本篇博文下留言,正确的留言单位换算就打算加上链接,错误的就请大家帮忙纠正一下,感谢各位配合!!!常用物理量的名称、符号和单位名称…

    2022年5月14日
    171
  • 滤波算法(四)—— 卡尔曼滤波算法

    滤波算法(四)—— 卡尔曼滤波算法一、算法介绍卡尔曼滤波是一个神奇的滤波算法,应用非常广泛,它是一种结合先验经验、测量更新的状态估计算法。1、状态估计首先,对于一个我们关心的物理量,我们假设它符合下面的规律其中,为该物理量本周期的实际值,为该物理量上一个周期的实际值,当然这个物理量可能不符合这个规律,我们只是做了一个假设。不同的物理量符合的规律不同,是我们的经验,我们根据这个规律…

    2022年6月13日
    53
  • Linux系统磁盘分区及挂载 – fdisk[通俗易懂]

    Linux系统磁盘分区及挂载 – fdisk[通俗易懂]本文关键字:文件系统,磁盘分区,格式化,挂载。当我们拿到一块新的硬盘时,他所能够支持的最大空间只是代表硬件上的一个参数,我们要想让他能够正常的工作起来,必须要有相应的文件系统。文件系统决定了文件存储和管理时的方式和数据结构,也就是如何管理磁盘上的文件和文件夹。不同的文件系统拥有不同的特点,这也就是为什么我们在进行格式化操作必须要选定一种文件系统的原因。

    2022年8月11日
    16
  • C++中的seekg函数

    C++中的seekg函数seekg对输入文件定位,有两个参数:*第一个:表示偏移量,可正可负,正表示向后,负表示向前*第二个:偏移的基地址myFile.seekg(sizeof(Record),ios::beg);//其中Record为一个类,ios::beg为输入流的开始;myFile.read((char*)&record,sizeof(record));//函数原型istre

    2022年6月6日
    72
  • 单片机声源定位_基于stm32交通灯源代码

    单片机声源定位_基于stm32交通灯源代码stm32声源定位本科毕业设计(论文)基于STM32单片机声源方向识别器设计与实现摘要近年来,基于麦克风阵列的声源定位系统被广泛地应用于电话会议、视频会议、语音增强、助听器等系统中,因此受到了越来越多的关注,已经成为一大研究热点。在各种声源定位方法中,基于到达时延估计的双步定位法原理简单,运算量小,精度相对较高,有利于实时实现,因此它的应用也最为广泛,本文着重研究了该方法。本文首先给出了麦克风阵列…

    2022年9月22日
    5
  • 毕业设计之我的项目—-旅游管理系统的设计与实现[通俗易懂]

    毕业设计之我的项目—-旅游管理系统的设计与实现[通俗易懂]本项目需求来源于网络,有需要源码和交流的评论额?喜欢软件对软件有着很高程度认识的朋友也可以指出我的设计问题等等。欢迎与我交流角色分析角色:用户:管理员:功能分析用户:登录注册:修改个人信息预定酒店功能个人酒店订单查询:景点信息查询:酒店评价:景点评价:游记功能:增-查线路查询:轮播图:结伴游:…

    2022年6月3日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号