Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个 小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情:

1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较 大的话还要对子任务进行继续分割

2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双 端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里 取数据,然后合并这些数据。

在Java的Fork/Join框架中,使用两个类完成上述操作

1.ForkJoinTask:我们要使用Fork/Join框架,首先需要创建一个ForkJoin任务。该类提供 了在任务中执行fork和join的机制。通常情况下我们不需要直接集成ForkJoinTask类,只需要 继承它的子类,Fork/Join框架提供了两个子类:

a.RecursiveAction:用于没有返回结果的任务

b.RecursiveTask:用于有返回结果的任务

2.ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行 任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一 个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务(工 作窃取算法)。

Fork/Join框架的实现原理

ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责将存放程序提交给ForkJoinPool,而ForkJoinWorkerThread负责执 行这