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


相关推荐

  • FileSystemWatcher 用法

    FileSystemWatcher 用法1.FileSystemWatcher基础在应用FileSystemWatcher对象之前,必须了解这个对象的一些基本属性和事件。毫无疑问,这个对象的最重要的属性为“EnableRaisingEvents”属性。这个属性决定对象在收到改变通知时是否提交事件。如果EnableRaisingEvents属性设为假,对象将不会提交改变事件。如果设为真,它将提交改变事件。下面是在应用FileSys

    2022年6月17日
    18
  • Linux LAMP架构介绍及配置「建议收藏」

    Linux LAMP架构介绍及配置「建议收藏」LinuxLAMP架构介绍及配置一、LAMPLAMP平台概述LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整台系统和相关软件,能够提供动态web站点服务及其应用开发环境LAMP是一个缩写词,具体包括Linux操作系统,Apache网站服务器,MySQL数据库服务器,PHP(或perl,Python)网页编程语言LAMP各组件主要作用(平台)Linux:作为LAMP架构的基础,提供用于支撑Web站点的操作系统,能够与其他三个组件提供更好的稳定性,兼容性(AMP组件也

    2022年10月16日
    0
  • vscode html注释快捷键_宇宙最强vscode教程(基础篇)

    vscode html注释快捷键_宇宙最强vscode教程(基础篇)本文主要介绍vscode在工作中常用的快捷键及插件,目标在于提高工作效率本文的快捷键是基于mac的,windows下的快捷键放在括号里Cmd+Shift+P(winCtrl+Shift+P)零、快速入门有经验的可以跳过快速入门或者大致浏览一遍1.命令面板命令面板是vscode快捷键的主要交互界面,可以使用f1或者Cmd+Shift+P(winCtrl+Shift+P)打开。在命令…

    2022年6月9日
    50
  • Linux安装rinetd

    为什么80%的码农都做不了架构师?>>>…

    2022年4月7日
    120
  • [转] 2016 JavaScript 发展现状大调查[通俗易懂]

    [转] 2016 JavaScript 发展现状大调查[通俗易懂][转] 2016 JavaScript 发展现状大调查

    2022年4月20日
    39
  • pip安装scrapy失败_scrapy框架运行

    pip安装scrapy失败_scrapy框架运行错误如图所示,running setup.py install for Twisted…..errorTwisted依赖库安装报错,重新下载手动安装一下下载网址:https://www.lfd.uci.edu/~gohlke/pythonlibs注意:看下安装的python是什么版本,我安装的python 3.9.0,就下载cp39,64位的下载安装的版本不对,就会报:Twisted-20.3.0-cp38-cp38-win_amd64.whl is not a support…

    2022年8月18日
    4

发表回复

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

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