ForkJoinPool.commonPool()相当于没有池吗?

bn.*_*bn. 10 java multithreading java-8

我已经确定使用并行流确实比我的数据集的串行流更快.话虽如此,我想知道在这个问题中讨论使用的ForkJoinPool:Java 8并行流中的自定义线程池.

鉴于,

void foo()
{
     barCollection.parallelStream()  … do something with the stream
}
Run Code Online (Sandbox Code Playgroud)

相对于哪个池将使用1和2以下?

1)

ForkJoinPool.commonPool().submit(()->foo()).get();
Run Code Online (Sandbox Code Playgroud)

2)

foo();
Run Code Online (Sandbox Code Playgroud)

如果答案是肯定的,那么为什么该ForkJoinPol.commonPool()方法存在?

Bri*_*etz 17

并行流执行将使用公共池,但流库只是该池的一个可能的客户端.

至于为什么该commonPool()方法存在,你的假设 - 由于流存在公共池 - 是不正确的.公共池存在(并且很容易到达)以防止不可避免的"公共悲剧",其中并行操作的每个启动器创建它们自己的池,导致单个JVM上的池线程太多,从而破坏了效率.对于公共游泳池,阻力最小的路径 - 只需使用公共游泳池 - 通常也是最佳选择.

并行流是并行操作的一个这样的启动器,并使用公共池,但不是特殊的.

  • 感谢您的回复并纠正我的假设,这就是我正在寻找的确切信息。 (2认同)