什么是 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