为啥 CompletableFuture.runAsync() 并不总是提交给 ForkJoinPool.commonPool()?

Posted

技术标签:

【中文标题】为啥 CompletableFuture.runAsync() 并不总是提交给 ForkJoinPool.commonPool()?【英文标题】:Why does CompletableFuture.runAsync() not always submit to ForkJoinPool.commonPool()?为什么 CompletableFuture.runAsync() 并不总是提交给 ForkJoinPool.commonPool()? 【发布时间】:2020-04-13 00:32:42 【问题描述】:

CompletableFuture.runAsync 文档状态:

返回一个新的 CompletableFuture,它在运行给定操作后由 ForkJoinPool.commonPool() 中运行的任务异步完成。

但是,据我所知,runAsync 仅在ForkJoinPool.getCommonPoolParallelism() > 1 时向ForkJoinPool.commonPool() 提交任务。如果没有,它会为每个提交的任务手动创建一个新的Thread

为什么会这样?

【问题讨论】:

【参考方案1】:

是的,如果 ForkJoinPool 并行度小于 2,则为每个任务创建新线程here

所有没有显式 Executor 参数的异步方法都使用 ForkJoinPool.commonPool() 执行(除非它不支持至少两个并行级别,在这种情况下,会创建一个新线程来运行每个任务)。

【讨论】:

我可以看到,但我想详细说明为什么在并行度不大于1(因此,默认情况下,当您有一个或两个逻辑核心时)。

以上是关于为啥 CompletableFuture.runAsync() 并不总是提交给 ForkJoinPool.commonPool()?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?