Java 并发之 Fork/Join 框架

Fork/Join框架是Java中用于并行处理的线程池,基于分治策略。它将大任务拆分成多个子任务并行执行,然后合并结果。文章通过一个数字列表求和的示例展示了Fork/Join框架的使用,包括RecursiveTask的实现。框架设计上采用工作窃取算法,利用双端队列和ForkJoinPool线程池确保任务并行执行。ForkJoinTask类表示可分的任务,ForkJoinPool负责任务的执行。总结指出,合理设置小任务阈值能提升程序性能。
摘要由CSDN通过智能技术生成

什么是 Fork/Join 框架

Fork/Join 框架是一种在  JDK 7 引入的线程池,用于并行执行 把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果 的特殊任务。通过其命名也很容易看出框架主要分为  Fork 和  Join 两个阶段,第一阶段  Fork 是把一个大任务拆分为多个子任务并行的执行,第二阶段  Join 是合并这些子任务的所有执行结果,最后得到大任务的结果。

这里不难发现其执行主要流程:首先判断一个任务是否足够小,如果任务足够小,则直接计算,否则,就拆分成几个更小的小任务分别计算,这个过程可以反复的拆分成一系列小任务。 Fork/Join 框架是一种基于  分治 的算法,通过拆分大任务成多个独立的小任务,然后并行执行这些小任务,最后合并小任务的结果得到大任务的最终结果,通过并行计算以提高效率。

Fork/Join 框架使用示例

下面通过一个 计算列表中所有元素的总和 的示例来看看  Fork/Join 框架是如何使用的,总的思路是:将这个列表分成许多子列表,然后对每个子列表的元素进行求和,然后,我们再计算所有这些值的总和就得到原始列表的和了。 Fork/Join 框架中定义了  ForkJoinTask 来表示一个  Fork/Join 任务,其提供了  fork() 、 join() 等操作,通常情况下,我们并不需要直接继承这个  ForkJoinTask 类,而是使用框架提供的两个  ForkJoinTask 的子类:

  • RecursiveAction  用于表示 没有返回结果 的  Fork/Join  任务。
  • RecursiveTask  用于表示 有返回结果 的  Fork/Join  任务。

很显然,在这个示例中是需要返回结果的,可以定义 SumAction 类继承自  RecursiveTask ,代码如下:

/**
 * @author mghio
 * @since 2021-07-25
 */
public class SumTask extends RecursiveTask<Long> {

  private static final int SEQUENTIAL_THRESHOLD = 50;

  private final List<Long> data;

  public SumTask(List<Long> data) {
    this.data = da
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值