Java的ForkJoinPool设计分析

ForkJoinPool是基于ExecutorService的,提供另一种线程的管理模型。下面是ForkJoinPoolForkJoinTask的整体设计:

ForkJoinWorkerThread的设计:

注意上面的WorkerQueue的设计。ForkJoinTaskfork()使用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,这本书讲各种并发理论模型,值得系统学习:

关于ExecutorServiceForkJoinPool的具体的比对,和使用场景的区别,可以参考这两篇:

下面是一个基于ForkJoinPoolRecursiveTask的递归任务:

可以看到我们需要把任务拆分成子任务:

然后进行Map -> Reduce过程(可以看到这个过程是递归的):

真正执行任务的是ForkJoinTask.invokeAll()方法:

这里面会使用ForkJoinPool的一整套东西,包括前面说的work-stealing queue,提供一个线程池的管理和线程的使用。关于ForkJoinPool的设计,还有很多值得挖的,有价值的东西,后续慢慢介绍。