fork join语句_java forkjoinpool

fork join语句_java forkjoinpool借鉴大数据里分而治之的思想

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

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

一、什么是ForkJoin

大数据里面有map reduce ,Java从JDK1.7开始借鉴了这种分而治之的思想,提供ForkJoin框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果

Fork:把一个复杂任务进行分拆,大事化小
Join:把分拆任务的结果进行合并

二、3大类

2.1 ForkJoinPool
分支合并池 类比=> 线程池
在这里插入图片描述
2.2 ForkJoinTask
ForkJoinTask 类比=> FutureTask
在这里插入图片描述
2.3 RecursiveTask
递归任务:继承后可以实现递归(自己调自己)调用的任务
在这里插入图片描述

三、使用示例
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

class MyTask extends RecursiveTask<Integer>{
    private static final Integer ADJUST_VALUE = 10;
    private int begin;
    private int end;
    private int result;

    public MyTask(int begin, int end) {
        this.begin = begin;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if((end - begin)<=ADJUST_VALUE){
            for(int i =begin;i <= end;i++){
                result = result + i;
            }
        }else{
            int middle = (begin + end)/2;
            MyTask task01 = new MyTask(begin,middle);
            MyTask task02 = new MyTask(middle+1,end);
            task01.fork();
            task02.fork();
            result =  task01.join() + task02.join();
        }


        return result;
    }
}


/**
 * 分支合并例子
 * ForkJoinPool
 * ForkJoinTask
 * RecursiveTask
 */
public class ForkJoinDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        MyTask myTask = new MyTask(0,100);
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);

        System.out.println(forkJoinTask.get());

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

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

(0)
上一篇 2026年1月30日 上午9:43
下一篇 2026年1月30日 上午10:15


相关推荐

  • 报错:8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码

    报错:8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码8000401a因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码服务器OS:windowsserver2012R2解决方案:运行dcomcnfg,依次打开计算机->我

    2022年7月2日
    26
  • 使用微软官方工具下载安装Windows10系统

    使用微软官方工具下载安装Windows10系统准备安装盘首先准备一个8G以上容量的U盘,并从微软官网下载Windows10下载工具:https://www.microsoft.com/zh-cn/software-download/windows10注意在执行下面操作之前备份好您U盘上的数据,因为下面的操作会清空该U盘上的所有数据。制作过程双击打开下载到的MediaCreationTool1809.exe文件,弹出Wi…

    2022年5月20日
    33
  • ubuntu下安装nginx_Linux中安装Nginx

    ubuntu下安装nginx_Linux中安装Nginx1.首先使用dpkg命令查看自己需要的软件是否安装。①、例如查看zlib是否安装:dpkg-l|grepzlib②、依赖包openssl安装,命令:sudoapt-getinstallopenssllibssl-dev③、解决依赖包pcre安装,命令:sudoapt-getinstalllibpcre…

    2026年1月21日
    5
  • JS数组的长度问题

    JS数组的长度问题说得 js 获取数组长度 相信都会第一时间想到 array length 但是 length 有明显的缺陷 比如 varstr str 99 99 console log str length 得到的结果是 100varstr str name javascript str test sds

    2026年3月17日
    3
  • 目标检测(降低误检测率及小目标检测系列笔记)[通俗易懂]

    目标检测(降低误检测率及小目标检测系列笔记)[通俗易懂]深度学习中,为了提高模型的精度和泛化能力,往往着眼于两个方面:(1)使用更多的数据(2)使用更深更复杂的网络。**一、什么是负样本**负样本是指不包含任务所要识别的目标的图像,也叫负图像(NegtiveImage)。以识别限速牌为例,如下所示,左图包含限速牌,为正样本,右图不包含限速牌,为背景图,即负样本。正样本负样本2.为什么要训练负样本训练负样本的目的是为了降低误检测率、误识别率,提高网络模型的泛化能力。通俗地讲就是告诉检测器,这些“不是你要检测的目标”。3.F

    2022年10月13日
    5
  • Debian6安装fcitx4

    Debian6安装fcitx4http://ftp.tw.debian.org/debian/pool/main/f/fcitx/下载fcitx-data_4.0.1-6_i386.debhttp://ftp.tw.debian.org/debian/pool/main/f/fcitx下载fcitx_4.0.1-6_i386.debdpkg-ifcitx-data_4.0.1-6_i386.debfcitx_4.0.1-6_i386.deb但是fcitx-sunpinyin都没有进入Debian可以从ubuntu实验区下载http

    2022年10月19日
    5

发表回复

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

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