固定线程池和预定线程池之间的Java差异

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

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

newFixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads)创建一个线程池,该线程池重用一组在共享无界队列中运行的固定线程 . 如果任何线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程 . 参数:nThreads - 池中的线程数返回:新创建的线程池

newScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)创建一个线程池,可以调度命令在给定的延迟后运行,或者定期执行 . 参数:corePoolSize - 池中保留的线程数,即使它们处于空闲状态 . 返回:新创建的计划线程池

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

回答(4)

3 years ago

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

nThreads和corePoolSize是要生成的线程数 . 对于固定的执行者,它始终是相同的 . 对于其他实现,它在min(corePoolSize)和max(maxPoolSize)之间变化 .

3 years ago

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

Class ScheduledThreadPoolExecutor

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

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

3 years ago

是的,它们在线程池大小方面完全相同:它们ultimately both call相同ThreadPoolExecutor constructor .

3 years ago

newScheduledThreadPool方法用于创建正好n个线程的线程池,无论它们是空闲还是正在运行 . int参数指定线程数 .

newFixedThreadPool方法是 not 用于创建 exactly n个线程的线程池,无论它们是空闲还是正在运行 . 固定线程池的大小会根据活动任务的数量而变化 .