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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python怎么调用模块_切换模块的功能和特点

    python怎么调用模块_切换模块的功能和特点简介Python的PyYAML模块是Python的YAML解析器和生成器。安装简单安装pipinstallpyyaml从源码安装下载源码包PyYAML-3.13.tar.gz并解压,在命令行下切换到解压后的包目录内并执行如下命令:pythonsetup.pyinstall如果想使用比纯Python版本更快的LibYAML绑定,需要先下载并安装LibYAML,然后在安装…

    2022年4月19日
    42
  • TOMCAT启动错误:严重: Error filterStart「建议收藏」

    TOMCAT启动错误:严重: Error filterStart「建议收藏」在tomcat启动的时候报严重:ErrorfilterStart这样的错误的原因有很多种,比如你在web.xml的配置语句写漏或写错或缺少某些jar包等等都有可能发生,子猴这里给出的不是针对某一具体错误如何解决,而是给出如何查找出错原因?我发现网上很多朋友都碰到过这样的错误信息而束手无策,往往花费很多时间,而归根结底是不知道如何得知错误是怎么产生的,因为tomcat(往往都是使用的tomca

    2022年7月11日
    20
  • rpm 卸载软件_linux删除rpm卸载密码

    rpm 卸载软件_linux删除rpm卸载密码查看所有的java安装包rpm-qa|grepjava卸载安装包,忽略依赖rpm-e–nodepsopenjdkxxx

    2022年9月22日
    3
  • Model、ModelMap和ModelAndView的使用详解

    Model、ModelMap和ModelAndView的使用详解1.前言最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别。这两者之间…

    2022年7月25日
    20
  • Git使用流程_git详细教程

    Git使用流程_git详细教程以coding为例,演示如何使用git首先理解下整个流程,如图一,将本地代码上传到远程仓库1.(电脑里得先下载git)登录coding,新建一个仓库,点击代码浏览可以看到2.在本地新建一个文件夹,作为项目根目录,再此启动GitBash,进入目录,并输入gitinit初始化一个本地git仓库3.将本地仓库和我们在coding上创建的远程仓库对接起来,输入gitre…

    2022年4月19日
    145
  • js中数组截取方法

    js中数组截取方法slice()vararray=[1,5,3,9,8];varcut=array.slice(1,4);console.log(cut);打印出的结果是[5,3,9]值得注意的是,slice()不会操作原有数组,所以打印array的话,是不会变的vararray=[1,5,3,9,8];varcut=array.slice(1,4);console.log(cut);console.log(array);打印结果是[5,3,9][1,5,

    2022年5月27日
    74

发表回复

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

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