3

Executors.newWorkStealingPool()允许创建具有目标并行度的有限并发池。在幕后,它似乎创建了一个新的 ForkJoinPool ,其中定义了此处定义的默认工作创建工厂。

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

相关:仅使用 ExecutorService 中的一部分线程

4

1 回答 1

4

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

和API 不允许您回收任意Thread对象。问题是需要一个实现来返回一个给定的线程,但API 只允许由构造函数设置。ThreadFactoryThreadThreadFactory::newThreadRunnableThreadRunnableThread

  • 解决这个问题Thread会破坏模型。Runnable(替换已经启动的线程是什么意思。)

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

于 2017-11-24T07:56:14.853 回答