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));
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • HTML实用的网页代码大全[通俗易懂]

    HTML实用的网页代码大全[通俗易懂]【一】:符号&lt;p&gt;段落&lt;/p&gt; &lt;h&gt;标题&lt;/h&gt;(h1—h6) &lt;br&gt;:换行 &lt;hr&gt;:分割线 左右尖括号:&amp;lt;&amp;gt; &amp;表示为:&amp;amp "表示为:&amp;quot; 表格形式&lt;table&gt;

  • 几种更新(Update语句)查询的方法

    几种更新(Update语句)查询的方法

  • fprintf函数的作用_c语言fopen函数的用法

    fprintf函数的作用_c语言fopen函数的用法fprintf(简介)fprintf是C/C++中的一个格式化库函数,位于头文件中,其作用是格式化输出到一个流文件中;函数原型为intfprintf(FILE*stream,constchar*format,[argument]…),fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。以“分别用十进制,八进制,十六进制输…

    2022年10月19日
  • sas ods html的作用是什么意思,SAS ODS「建议收藏」

    sas ods html的作用是什么意思,SAS ODS「建议收藏」SAS程序的输出可以转换为更加用户友好的形式,如.html或PDF。这是通过使用SAS中提供的ODS语句来完成的。ODS代表输出传递系统。它主要用于格式化SAS程序的输出数据到好的报告,这是很好看的和理解。这也有助于与其他平台和软件共享输出。它还可以将多个PROC语句的结果合并在一个文件中。语法在SAS中使用ODS语句的基本语法是:ODSoutputtypePATHpathname…

  • linux ssh代理 –快速搭建代理服务器

    linux ssh代理 –快速搭建代理服务器前言:开发机器IP固定,路由上有限制,不通直连。是个很郁闷的事。有个时间在网上看到的ssh代理转发。命令功能很强大。在这我就对自己了解的画了个间图方便大家理解。本地转发、正向隧道“本机”连上“ssh服务器”,然后把”ssh服务器”能访问的机器地址和端口(当然也包括“ssh服务器”自己)镜像到”本机”的端口上。命令:ssh-L[客户端IP或省略]:[客户端端口]:[服务器侧能访问的IP]:[服

发表回复

您的电子邮箱地址不会被公开。

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