一、概述
ForkJoinPool
作为线程池,ForkJoinTask
为任务,ForkJoinWorkerThread
作为执行任务的线程,三者构成的任务调度机制在 Java
中通常被称为ForkJoin
框架。
ForkJoin
框架在Java 7
的时候就加入到了Java
并发包 java.util.concurrent
,并且在Java 8
的lambda
并行流中充当着底层框架的角色。
主题思想是采用“分而治之”的算法将一个大型复杂任务 fork()
分解成足够小的任务才使用多线程去并行处理这些小任务,处理完得到各个小任务的执行结果后再进行join()
合并,将其汇集成一个大任务的结果,最终得到最初提交的那个大型复杂任务的执行结果。
ForkJoin
框架适用于非循环依赖的纯函数的计算或孤立对象的操作,如果存在I/O
,线程间同步
,sleep()
等会造成线程长时间阻塞的情况时会因为任务依赖影响整体效率,此时可配合使用 ManagedBlocker
。ManagedBlocker
相当于明确告诉 ForkJo