我有一个固定的线程池,可以随时运行7个并发线程(带队列),我想把它变成一个只运行7个并发作业的调度线程池,但可以排队/安排更多。
阅读文档并没有真正帮助我..
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,重用一组固定的线程 共享的无界队列。如果任何线程因故障而终止 在关闭之前执行期间,如果是,新的将取代它 需要执行后续任务。
参数: nThreads - 池中的线程数返回: 新创建的线程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个线程池,可以安排命令在给定后运行 延迟,或定期执行。
参数: corePoolSize - 池中保留的线程数,即使它们处于空闲状态。返回: 新创建的预定线程池
我不明白的是,corePoolSize和nThreads是一回事吗?调度线程池是否真的是固定线程池的一个子集,这意味着我可以将调度线程池用作可以对延迟任务进行排队的固定线程池?
答案 0 :(得分:4)
是的,它们基本上是相同的,只是增加了调度功能。 ScheduledThreadPoolExecutor甚至扩展了ExecutorService(ThreadPoolExecutor)的默认实现。
nThreads和corePoolSize是要生成的线程数。对于固定的执行者,它始终是相同的。对于其他实现,它在min(corePoolSize)和max(maxPoolSize)之间变化。
答案 1 :(得分:1)
是的,它在JDK5-6中以这种方式工作。虽然原则上ScheduledExecutorService接口对池大小问题保持沉默,但JDK中使用它的实际实现使用固定池:
Class ScheduledThreadPoolExecutor
虽然这个类继承自 ThreadPoolExecutor,其中的几个 继承的调优方法不是 对它有用。特别是因为 它充当固定大小的池使用 corePoolSize线程和无界 队列,调整maximumPoolSize 没有用处。
如果您使用应用程序框架或其他供应商提供的ScheduledExecutorService的不同实现,显然可能不成立。
答案 2 :(得分:0)
是的,它们在线程池大小方面完全相同:它们ultimately both call相同ThreadPoolExecutor constructor。
答案 3 :(得分:0)
newScheduledThreadPool方法用于创建正好n个线程的线程池,无论它们是空闲还是正在运行。 int参数指定线程数。
newFixedThreadPool方法不用于创建完全 n个线程的线程池,无论它们是空闲还是正在运行。固定线程池的大小会根据活动任务的数量而变化。