10

我有一个固定的线程池,可以随时运行 7 个并发线程(带有一个队列),我想把它变成一个调度线程池,它只运行 7 个并发作业,但可以排队/调度更多。

阅读文档并没有真正帮助我..

新的固定线程池

公共静态 ExecutorService newFixedThreadPool(int nThreads)

创建一个线程池,该线程池重用一组固定的线程,这些线程在共享无界队列中运行。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。

参数:nThreads - 池中的线程数返回:新创建的线程池

newScheduledThreadPool

公共静态 ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

创建一个线程池,可以安排命令在给定延迟后运行,或定期执行。

参数: corePoolSize - 保留在池中的线​​程数,即使它们是空闲的。返回:一个新创建的调度线程池

我不明白的是, corePoolSize 和 nThreads 是一回事吗?调度线程池真的是固定线程池的子集吗,也就是说我可以将调度线程池用作可以对延迟任务进行排队的固定线程池?

4

3 回答 3

7

是的,它们基本上是一样的,只是增加了调度功能。ScheduledThreadPoolExecutor 甚至扩展了 ExecutorService (ThreadPoolExecutor) 的默认实现。

nThreads 和 corePoolSize 是要生成的线程数。对于一个固定的执行者,它总是一样的。对于其他实现,它在 min (corePoolSize) 和 max (maxPoolSize) 之间变化。

于 2011-05-17T22:15:14.200 回答
1

是的,它在 JDK5-6 中就是这样工作的。虽然原则上 ScheduledExecutorService 接口对池大小问题保持沉默,但它在 JDK 中使用的实际实现使用固定池:

类 ScheduledThreadPoolExecutor

虽然这个类继承自 ThreadPoolExecutor,但一些继承的调优方法对它没有用。特别是,因为它充当使用 corePoolSize 线程和无界队列的固定大小的池,所以对 maximumPoolSize 的调整没有有用的效果。

显然,如果您使用由应用程序框架或不同供应商提供的不同的 ScheduledExecutorService 实现,这可能不成立。

于 2011-05-17T22:12:59.847 回答
0

是的,它们在线程池大小方面完全相同:它们最终都调用相同的ThreadPoolExecutor 构造函数

于 2011-05-17T22:22:31.133 回答