java多线程中的Fork和Join

文章目录

    • [1. 简介](#1. 简介)
    • [2. 使用](#2. 使用)

1. 简介

Fork/Join是JDK 1.7中加入的新的线程池的实现,它体现的使用分治的思想,适用于能够进行任务拆分的cpu密集型任务。所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直到不能拆分可以直接求解。Fork/Join载分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率。Fork/Join默认会创建于cpu核心大小相同的线程池。

2. 使用

java 复制代码
public class TestFinal {
    public static void main(String[] args) {
        //创建线程池,里面有四个线程
        ForkJoinPool pool = new ForkJoinPool(4);
        //执行任务
        System.out.println(pool.invoke(new MyTask(5)));
        /**
         * 任务拆分 new MyTask(5)= 5+ {new MyTask(4)=4+new MyTask(3)....}
         */
    }
}

//1. 继承父类RecursiveTask,范型时Integer即任务结果的返回值,下面任务时计算1-100的和
class MyTask extends RecursiveTask<Integer> {
    private int n;

    public MyTask(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        if (n == 1) {
            return 1;
        }
        MyTask myTask = new MyTask(n - 1);
        myTask.fork(); //让另外一个线程去执行这个结果
        int result = n + myTask.join(); //获取另一个线程的结果
        return result;
    }
}

任务执行的结果实际如下所示:

相关推荐
信誓旦旦的程序猿2 分钟前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
小羊没烦恼!4 分钟前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
她的男孩7 分钟前
头像换了三次还是旧图:秒传 + 预签名 URL + 私有文件权限,四层缓存叠出一个 Bug
java·后端·架构
深入云栈8 分钟前
Netty 4.2.x 源码深度解析 (十五):io_uring 传输 —— RingBuffer 与零拷贝 IO
java·后端
MacroZheng11 分钟前
装上这款全能增强插件,DeepSeek Harness瞬间高大上了!
java·人工智能·后端
时间的拾荒人11 分钟前
Qt 信号与槽机制详解(二):连接方式详解与面试指南
开发语言·qt·面试
long、涯13 分钟前
win10安装Maven3.9(图文版)
java·maven
霸道流氓气质14 分钟前
LangGraph式图编排引擎Java实现:状态机模型、Checkpoint恢复与生产级落地实战
java·开发语言·数据库
AI深栈16 分钟前
第 19 章 · AI 工具循环与条件路由:管住 recursionLimit
java·人工智能
2601_9622186119 分钟前
C++ AVL树概念与实现详解
开发语言·c++