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


相关推荐

  • JavaScript的变量作用域深入理解(转)

    JavaScript的变量作用域深入理解(转)

    2021年9月6日
  • 御用导航提示页面_终实现微信位置发送到汽车导航 越用越好用

    御用导航提示页面_终实现微信位置发送到汽车导航 越用越好用我们使用微信,其中一个非常好用的功能就是发送位置。在朋友聚会或者去朋友家做客时,只需朋友发送一个微信用微信位置,我们就非常清楚的得知目的地,直接把这个位置推送给手机里的导航软件,并发起导航。然而对于习惯使用中控屏导航的车友来说,这个过程脱节了。微信位置只能使用手机导航,不能直接推送到车载导航。手动输入,无疑更加烦躁,担心输错,还要确认好几次。在最新的高德地图车机版中,我们留意到更新中“手…

    2022年5月30日
  • 支付宝开发 ——第三方支付[通俗易懂]

    支付宝开发 ——第三方支付[通俗易懂]支付宝开发第三方支付在线支付在线支付是指卖方与买方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务。它为企业和个人提供了一个安全、快捷、方便的电子商务应用环境和网上资金结算工具。在线支付不仅帮助企业实现了销售款项的快速归集,缩短收款周期,同时也为个人网上银行客户提供了网上消费支付结算方式,使客户真正做到足不出户,网上购物。 聚合支付聚合支付…

    2022年11月1日
  • Linux下wait, WIFEXITED, WEXITSTATUS的比较

    Linux下wait, WIFEXITED, WEXITSTATUS的比较偶尔翻到了这几个关键字,找到个文章复习了下:“点我”。记录下:wait的函数原型是:#include/*提供类型pid_t的定义*/#includepid_twait(int*status)进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已

    2022年4月20日
  • 语义分割看这一篇就够了!「建议收藏」

    语义分割看这一篇就够了!「建议收藏」语义分割技术综述本文就ImageSegmentationUsingDeepLearning:ASurvey第三章的模型进行了分析和介绍,第一第二章的基础指示可以看原文进行学习,相关知识有很多这里就不班门弄斧了。最好是一边读原文一边看本文效果更佳原文连接能力有限,水平一般,抱着学习的态度分享此文,有不准确的地方还请各位大佬斧正!3.1全连接网络关于FCN的资料有很多这里就不…

    2022年8月21日
  • 修改配置nginx,限制无良爬虫频率

    修改配置nginx,限制无良爬虫频率

    2021年8月30日

发表回复

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

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