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