Java固定线程池和调度线程池的区别

11
我有一个固定的线程池,每次运行7个并发线程(带有队列),我想将其转换为一个调度线程池,仅运行7个并发作业,但可以排队/计划更多。
阅读文档并没有真正帮助我... newFixedThreadPool 创建一个线程池,该线程池重用一组固定的线程,这些线程在共享的无界队列上操作。如果任何线程在关闭之前由于执行期间的故障而终止,则如果需要执行后续任务,新线程将取代它。
参数: nThreads - 池中的线程数 返回: 新创建的线程池 newScheduledThreadPool 创建一个线程池,可以安排命令在给定的延迟后运行,或定期执行。
参数: corePoolSize - 保留在池中的线程数,即使它们处于空闲状态。 返回: 新创建的调度线程池
我不明白的是,corePoolSize和nThreads是同一件事吗?计划任务线程池真的是固定线程池的子集吗,这意味着我可以将计划任务线程池用作可以排队延迟任务的固定线程池吗?

你能详细说明为什么你想要除了固定线程池之外的东西吗?你有阅读过ScheduledExecutorService的javadoc吗? - Daniel Lubarov
我目前正在使用FixedThreadPool,但希望能够在一定延迟后安排任务。例如,一个小时后安排任务。除了像今天这样立即执行任务之外,还希望能够实现这种功能。 - Mohamed Nuur
1
它本可以被称为Executors.newFixedScheduledThreadPool(n),但那太多字母了:/ - John Vint
3个回答

8

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

nThreads和corePoolSize是要生成的线程数。对于固定的执行器,它始终是相同的。对于另一种实现方式,它在最小值(corePoolSize)和最大值(maxPoolSize)之间变化。


我也想到了,但还是要确认一下。 - Mohamed Nuur

1

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

类ScheduledThreadPoolExecutor

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

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


我看到了那个评论,那实际上让我有些困惑。谢谢! - Mohamed Nuur

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接