奇怪的ForkJoinPool行为

时间:2015-03-24 16:02:09

标签: java concurrency java-8 threadpool

Java8流和并行流使用ForkJoinPool.commonPool这是一个通用池(理论上可以保留与机器上的CPU一样多的线程)用于简短任务......

我正在使用一些java8功能,我注意到池只保留一个线程并不断杀死并替换它...

enter image description here

如果我选择仅查看活动线程,则池中只有一个线程...

enter image description here

所以问题是为什么池一直替换线程?为什么不重用呢?这是正常行为吗? (如果是,为什么?)

1 个答案:

答案 0 :(得分:2)

我不认为你的扣除是正确的。该池有X个线程。让我们说它从5个线程开始。现在将有5个处于IDLE状态的线程。如果你交给它,它会将1个线程置于ACTIVE状态,然后一旦工作完成,它就会回到IDLE状态。如果池由队列支持,则首先拉出的线程是Thread0,然后它将转到池的后面,池使用其他4个线程,然后才会再次使用Thread0。这是它在图表中显示的模式。 可能你只看到1个线程的原因是你的工作很短,线程完成并在下一个线程开始之前返回IDLE。

修改

来自code: 它创建一个LIFO队列,如果无法确定其他属性/核心数,则使用1个线程。根据您启动应用程序的方式,它可能会导致一些意外行为,但由于我不了解您的系统或应用程序,因此无法确定。上面的答案只是解释线程池的工作方式,并且可以根据这种解释理解您在第一张图像中显示的模式。