为什么Java工作窃取池(ForkJoinPool)不支持从线程池中预先创建的线程?

时间:2017-11-24 06:08:31

标签: java java-8 threadpool forkjoinpool

Executors.newWorkStealingPool()允许创建具有目标并行性的有限并发池。在引擎盖下,它似乎创建了一个新的ForkJoinPool,其默认工作者创建工厂定义为here

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

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

1 个答案:

答案 0 :(得分:4)

  

为什么这个池不允许使用现有池中的线程子集来支持有限的并发性,同时仍然避免每次都创建新线程?

ThreadThreadFactory API不允许您回收任意Thread个对象。问题是ThreadFactory::newThread要求实现返回给定Runnable的线程,但Thread API仅允许Runnable设置Thread构造函数。

  • Thread中修复此问题会破坏模型。 (替换已启动的线程的Runnable是什么意思。)

  • 理论上可以通过定义Thread的子类来修复,其中实际的run()方法在循环中运行用户提供的Runnable。但它变得复杂....而且你只能回收那个子类的实例......而不是任意的线程。