ForkJoin
当我们想执行一个数据量较大的任务时,传统的串行执行效率会极低。为了解决这个问题,jdk7出现了 forkjoin框架,基于分治算法实现,并采用工作偷窃算法加快任务的执行速度,充分利用CPU资源。
框架组件
1.ForkJoinTask–任务,有两种实现类:RecursiveTask–会返回任务的最终结果,RecursiveAction–不会返回任务的结果
2.ForkJoinPool,任务执行的线程池,主要维护了一个工作队列数组WorkQueue[ ]
3.ForkJoinWorkerThread,特殊的工作线程,在初始化ForkJoinPool可以指定希望有多少个ForkJoinWorkerThread并行执行,如果不指定则默认为电脑的cpu核数。
基本流程
1.一个任务提交到ForkJoinPool后,首先创建第一个工作线程开始执行,每个工作线程都会创建自己的工作队列放到pool维护的WorkQueue[ ],以便其他线程空闲的时候偷取队列中的任务加快总体执行速度。
2.开始执行任务后,调用ForkJoinTask的compute()方法,如果满足自定义的执行条件,执行该任务,返回结果。如果不满足执行条件,调用任务的fork()方法开始递归切分当前任务,然后调用join()方法将自己挂起,等待当前任务切分的所有子任务执行完,合并当前compute()方法切分的所有子任务的结果,层层返回,最外层的compute()方法返回最终结果。
3.工作线程执行完自己的任务后,会尝试遍历pool维护的WorkQueue[ ],偷取其他线程队列中的任务帮助执行。
ps:看了大佬的文章,发现写总结出来太多了,于是写了简易版的流程,此处转大佬的文章ForkJoin框架剖析