Java 5 以 Executor 框架的形式引入了对线程池异步任务执行的支持,其核心是 java.util.concurrent.ThreadPoolExecutor 实现的线程池。Java 7 以 java.util.concurrent.ForkJoinPool 的形式添加了一个替代线程池。
查看它们各自的 API,ForkJoinPool 在标准场景中提供了 ThreadPoolExecutor 功能的超集(尽管严格来说 ThreadPoolExecutor 提供了比 ForkJoinPool 更多的调优机会)。除此之外,观察到 fork/join 任务似乎更快(可能是由于工作窃取调度程序),需要的线程肯定更少(由于非阻塞连接操作),人们可能会觉得 ThreadPoolExecutor 已被取代ForkJoinPool。
但这真的正确吗?我读过的所有材料似乎都总结了两种线程池之间相当模糊的区别:
- ForkJoinPool 用于许多相关的、任务生成的、短的、几乎不会阻塞(即计算密集型)任务
- ThreadPoolExecutor 用于少数、独立、外部生成、长、有时阻塞的任务
这种区别完全正确吗?我们能说得更具体一点吗?