Executors.newWorkStealingPool()允许创建具有目标并行性的有限并发池。在引擎盖下,它似乎创建了一个新的ForkJoinPool,其默认工作者创建工厂定义为here。
这个工厂似乎在达到所需的并发性之前创建新线程。为什么此池不允许使用现有池中的线程子集来支持有限的并发性,同时仍然避免每次都创建新线程?我认为在Java中创建线程是很昂贵的。
答案 0 :(得分:4)
为什么这个池不允许使用现有池中的线程子集来支持有限的并发性,同时仍然避免每次都创建新线程?
Thread
和ThreadFactory
API不允许您回收任意Thread
个对象。问题是ThreadFactory::newThread
要求实现返回给定Runnable
的线程,但Thread
API仅允许Runnable
设置Thread
构造函数。
在Thread
中修复此问题会破坏模型。 (替换已启动的线程的Runnable
是什么意思。)
理论上可以通过定义Thread
的子类来修复,其中实际的run()
方法在循环中运行用户提供的Runnable
。但它变得复杂....而且你只能回收那个子类的实例......而不是任意的线程。