作为框架的提交入口,ForkJoinPool
管理着线程池中线程和任务队列,标识线程池是否还接收任务,显示现在的线程运行状态。
在 ForkJoinPool
中,线程池中每个工作线程(ForkJoinWorkerThread
)都对应一个任务队列(WorkQueue
),工作线程优先处理来自自身队列的任务(LIFO或FIFO顺序,参数 mode 决定),然后以FIFO的顺序随机窃取其他队列中的任务。
ForkJoinPool 中的任务分为两种:
- 一种是本地提交的任务(
Submission task
,如execute
、submit
提交的任务); - 另外一种是
fork
出的子任务(Worker task
)。
两种任务都会存放在 WorkQueue
数组中,但是这两种任务并不会混合在同一个队列里,ForkJoinPool
内部使用了一种随机哈希算法(有点类似 ConcurrentHashMap
的桶随机算法)将工作队列与对应的工作线程关联起来,Submission
任务存放在 WorkQueue
数组的偶数索引位置,Worker
任务存放在奇数索引位。实质上,Submission
与 Worker
一样,只不过他它们被限制只能执行它们提交的本地任务。
网友评论