Executors.newWorkStealingPool()允许创建具有目标并行性的有限并发池。在幕后,似乎使用默认工作创建工厂创建了一个新的ForkJoinPool,工厂定义为here

该工厂似乎会创建新线程,直到达到所需的并发为止。为什么该池不允许使用现有池中的线程子集来支持有限的并发性,同时仍避免每次都创建新线程?我认为在Java中创建线程是昂贵的。

相关:Use only a subset of threads in an ExecutorService

最佳答案

为什么该池不允许使用现有池中的线程子集来支持有限的并发性,同时仍避免每次都创建新线程?
ThreadThreadFactory API不允许您回收任意的Thread对象。问题在于ThreadFactory::newThread需要实现以返回具有给定Runnable的线程,但是Thread API仅允许Runnable构造函数设置Thread

  • Thread中修复此问题将破坏模型。 (替换已经启动的线程的Runnable是什么意思。)
  • 从理论上讲,可以通过定义Thread的子类来解决此问题,其中实际的run()方法在循环中运行用户提供的Runnable。但这变得很复杂....,您将只能回收该子类的实例...而不是任意线程。
  • 10-08 19:03