Java的ForkJoinPool设计分析
ForkJoinPool是基于ExecutorService的,提供另一种线程的管理模型。下面是ForkJoinPool
和ForkJoinTask
的整体设计:
ForkJoinWorkerThread
的设计:
注意上面的WorkerQueue
的设计。ForkJoinTask
的fork()
使用work-queue
:
ThreadPoolExecutor
里面也包含一个queue:
关于executor的work queue:
具体可以参考另外两篇有关Executors的进行对比:
ForkJoinPool.java
里面Doug Lea写的的文档要好好看(jdk7u-jdk/ForkJoinPool.java at master · openjdk-mirror/jdk7u-jdk · GitHub):
可以看到ForkJoinPool
的核心算法是去中心化的work-stealing queue
:
在文档里面,Doug Lea提到了一本书:
书名叫做The Art of Multiprocessor programming
,这本书讲各种并发理论模型,值得系统学习:
关于ExecutorService
与ForkJoinPool
的具体的比对,和使用场景的区别,可以参考这两篇:
- Java Tip: When to use ForkJoinPool vs ExecutorService・JavaWorld
- Fork/Join Framework vs. Parallel Streams vs. ExecutorService: The Ultimate Fork/Join Benchmark・DZone Performance
- 我理解的ForkJoinPoll・进击的大黄
下面是一个基于ForkJoinPool
的RecursiveTask
的递归任务:
可以看到我们需要把任务拆分成子任务:
然后进行Map -> Reduce
过程(可以看到这个过程是递归的):
真正执行任务的是ForkJoinTask.invokeAll()
方法:
这里面会使用ForkJoinPool
的一整套东西,包括前面说的work-stealing queue
,提供一个线程池的管理和线程的使用。关于ForkJoinPool
的设计,还有很多值得挖的,有价值的东西,后续慢慢介绍。