假设我有一个类似的代码:
class Foo {
private final ExecutorService executor;
public Foo(ExecutorService executor) {
this.executor = executor;
}
public void doSomething() {
executor.execute(() -> {/* Do important task */});
}
}
如果不是在构造函数中传递ThreadPoolExecutor
而是使用ForkJoinPool
,我可以获得更好的性能吗?如果是,那么为什么我应该更喜欢在任何情况下使用它而不是ThreadPoolExecutor
。
更新1
我的问题是关于ForkJoinPool
到ExecutorService
API的使用情况,并不假设使用ForkJoinPool
特定API进行递归任务拆分。
答案 0 :(得分:1)
如果您使用Simba website
,它将会生效public static ExecutorService newWorkStealingPool()
使用所有可用处理器作为目标并行级别创建工作窃取线程池。
您可以从此文档newWorkStealingPool中找到优势:
ForkJoinPool 提供非 ForkJoinTask 客户端提交的入口点,以及管理和监控操作。
ForkJoinPool 与其他类型的 ExecutorService 不同,主要是因为使用 工作窃取 :所有主题在池中尝试查找和执行提交到池的任务和/或由其他活动任务创建的任务(如果不存在则最终阻止等待工作)。
当大多数任务产生其他子任务时(大多数 ForkJoinTasks ),以及从外部客户端向池提交许多小任务时,这可以实现高效处理。特别是在构造函数中将 asyncMode 设置为true时, ForkJoinPools 也可能适用于从未加入的事件样式任务。
答案 1 :(得分:0)
是的,如果你有递归的非阻塞任务,你可以。
Here是来自最近Joker会议的Cay S. Horstmann的精彩解释。