009-并行计算框架Fork/Join框架

Fork/Join框架是一个用于并行计算的Java工具,它采用分治策略将大任务拆分成小任务进行处理。通常应用于数组处理、计算密集型任务和大数据处理。使用时需构建任务、定义拆分逻辑,然后在ForkJoinPool中执行。每个工作线程有自己的任务队列,允许线程间任务窃取,提高效率。需要注意任务深度以防止栈溢出,并可能需要自定义线程池。
摘要由CSDN通过智能技术生成

Fork/Join框架

作用

并行计算的框架
在CPU密集行的任务中
一个大的任务往往可以拆分成很多个小的任务
这些小的任务处理完成后再组成一个大的结果
这个就是分治任务模型
也就是并行计算框架处理的任务模型
Fork(拆分)/Join(结合)

一般用作:

  1. 递归分解型任务
  2. 数组处理
  3. 并行化计算
  4. 大数据处理

使用步骤

  1. 构建一个任务的具体处理
    编写拆分的逻辑
    然后调用invokeAll
    invokeAll会自动把任务提交和合并结果
  2. 构建ForkJoin池
    和线程池的区别是,线程数就是CPU的逻辑核数
    并且每个线程都持有一个队列
    默认是先进后出的栈结构
  3. 调用ForkJoin池.invoke(具体任务)

设置自定义任务
在这里插入图片描述
这里的invokeAll就是把两个任务先fork 后 join

设置ForkJoin任务池
提交任务
在这里插入图片描述

任务拆分
在这里插入图片描述
这个例子中不涉及到任务合并如果有的话需要在 compute() 自己实现

实现具体的任务

接口是java.util.concurrent.ForkJoinTask
但是JDK以及提供了一些标准实现(抽象类)我们直接继承来用
比如递归处理RecursiveAction
在这里插入图片描述
Action是没有返回方法的
对应还有Task是有返回的
在这里插入图片描述

使用注意

  1. 使用的时候需要评估划分任务的深度,比如递归任务的时候需要关注递归的深度,避免栈溢出
  2. 最好自己指定专用的ThreadPoolExecutor来创建一个线程池

为啥快

  1. 每个工作线程都有自己的队列
  2. 线程窃取,空闲线程可以处理别的线程队列里的任务
    在这里插入图片描述

ForkJoinWorkerThread
添加任务push()
出队任务pop()
窃取任务poll()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值