Fork/Join框架
一、什么是Fork/Join框架
Fork/Join是JDK提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架
二、Fork/Join原理
Fork/Join是一个比较特殊的线程池框架,专用于需要将一个任务不断分解成子任务,再不断汇总得到最终结果的计算过程,比起传统的线程池类ThreadPoolExecutor,ForkJoinPool实现了工作窃取算法,使得空闲线程可以主动分担从别的线程分解出来的子任务,从而让所有的线程都尽可能的处于饱满的工作状态,并因此提高了工作效率
2.1 工作窃取
指某个线程从其他队列里窃取任务来执行,运行流程如下图所示:
三、JDK中Fork/Join家族成员
3.1 ForkJoinTask
实现了Future接口,但是比Future多了两个重要的方法
- fork():决定ForkJoinTask异步执行,通过这个方法创建新的任务
- join():负责计算后返回结果,允许一个任务等待另外一个任务执行完成
3.1.1 RecursiveAction
继承ForkJoinTask,用于没有返回结果的任务
3.1.1 RecursiveTask
继承ForkJoinTask,用于有返回结果的任务
3.2 ForkJoinPool
实现Executor接口,提供了三个方法用来调度任务
- execute():异步执行指定的任务
- invoke():和invokeAll()执行指定的任务,等待完成,返回结果
- submit():异步执行指定的任务,并立即返回一个Future对象
四、使用案例
4.1 对千万级数据求和
public class SumDemo {
private class SumTask extends RecursiveTask<Long> {
//阈值
private final static int threshold = 1000000;
private int[] arr;
private int startIndex;
private int endIndex;
public SumTask(int[] arr, int startIndex, int endIndex) {
this.arr = arr;
this.startIndex = startIndex;
this.endIndex = endIndex