一、引言
回顾一下,Fork/Join框架的核心实现类是ForkJoinPool线程池,其它核心组件包括:ForkJoinTask(任务)、ForkJoinWorkerThread(工作线程)、WorkQueue(任务队列)。
这一章,我们将深入F/J框架的实现细节,看看ForkJoinPool线程池究竟有何特殊之处,F/J框架的整个任务调度流程又是怎样的。
二、任务调度流程
在开始之前,先来看下下面这张图:
上图包含了F/J框架的整个任务调度流程,这里先简要介绍下,以便有个印象,后续的源码分析将完全按照这张图进行。
F/J框架调度任务的流程一共可以分为四大部分。
1、任务提交
任务提交是整个调度流程的第一步,F/J框架所调度的任务来源有两种:
①外部提交任务
所谓外部提交任务,是指通过ForkJoinPool的execute/submit/invoke方法提交的任务,或者非工作线程(ForkJoinWorkerThread)直接调用ForkJoinTask的fork/invoke方法提交的任务:
外部提交的任务的特点就是调用线程是非工作线程。这个过程涉及以下方法:
- ForkJoinPool.submit
- ForkJoinPool.invok