Executors.newWorkStealingPool()允许创建具有目标并行性的有限并发池。在幕后,似乎使用默认工作创建工厂创建了一个新的ForkJoinPool,工厂定义为here。
该工厂似乎会创建新线程,直到达到所需的并发为止。为什么该池不允许使用现有池中的线程子集来支持有限的并发性,同时仍避免每次都创建新线程?我认为在Java中创建线程是昂贵的。
相关:Use only a subset of threads in an ExecutorService
最佳答案
为什么该池不允许使用现有池中的线程子集来支持有限的并发性,同时仍避免每次都创建新线程?Thread
和ThreadFactory
API不允许您回收任意的Thread
对象。问题在于ThreadFactory::newThread
需要实现以返回具有给定Runnable
的线程,但是Thread
API仅允许Runnable
构造函数设置Thread
。
Thread
中修复此问题将破坏模型。 (替换已经启动的线程的Runnable
是什么意思。)Thread
的子类来解决此问题,其中实际的run()
方法在循环中运行用户提供的Runnable
。但这变得很复杂....,您将只能回收该子类的实例...而不是任意线程。