Java8流和并行流使用ForkJoinPool.commonPool,这是一个通用的池(理论上可以保持机器上的CPU数量一样多)用于短任务.
我正在使用一些java8特性,我注意到池只保留一个线程,并且不断地杀死和替换它.

如果我选择只看到活线程,我将只有一个线程在池中.

,所以问题是为什么池总是替换线程?为什么不重用它呢?这是正常的行为吗?(如果是,为什么?)
发布于 2015-03-24 16:18:00
我不认为你的推论是正确的。池有X个线程数。假设它从5个线程开始。现在将有5个处于空闲状态的线程。如果您将其工作,它将把一个线程进入活动状态,然后一旦工作完成,它会回到空闲。如果池是由队列支持的,那么首先拉出的线程是Thread0,然后是池的后面,池使用其他4个线程,只有这样,Thread0才会再次被使用。这是它在你的图表中显示的图案。您只看到一个线程活动的原因可能是您的工作太短,线程完成后在下一个线程启动之前返回到空闲状态。
编辑
从代码:它创建一个LIFO队列,如果无法确定其他属性/核数,则使用1个线程。根据启动应用程序的方式,它可能会导致一些意想不到的行为,但不能确定这一点,因为我不知道您的系统或应用程序。上面的答案只是解释线程池的工作方式,并且您在第一个映像中显示的模式可以根据这个解释来理解。
https://stackoverflow.com/questions/29237418
复制相似问题