我有一个固定的线程池,它可以在任何时候运行7个并发线程(带有队列),我希望将它转换为一个调度线程池,它只运行7个并发作业,但可以更多地排队/调度。
读这些文件对我没有多大帮助。
newFixedThreadPool
公共静态ExecutorService newFixedThreadPool(int nThreads) 创建一个线程池,该池重用在共享无界队列上操作的一组固定线程。如果任何线程由于在关闭之前的执行过程中失败而终止,那么如果需要执行后续任务,将有一个新线程代替它。 参数: nThreads -池中的线程数返回:新创建的线程池
newScheduledThreadPool
公共静态ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个线程池,该线程池可以安排命令在给定延迟后运行或定期执行。 参数: corePoolSize -保持在池中的线程数,即使它们是空闲的。返回:新创建的计划线程池
我不明白的是,corePoolSize和nThreads是同一回事吗?调度线程池真的是固定线程池的子集吗?这意味着我可以使用调度线程池作为一个固定线程池来排队延迟的任务?
发布于 2011-05-17 22:15:14
是的,它们基本上是一样的,只是增加了调度功能。ScheduledThreadPoolExecutor甚至扩展了ExecutorService (ThreadPoolExecutor)的默认实现。
nThreads和corePoolSize是要生成的线程数。对于一个固定的执行者来说,总是一样的。在其他实现中,它在最小(corePoolSize)和最大(maxPoolSize)之间变化。
发布于 2011-05-17 22:12:59
是的,它在JDK5-6中是这样工作的。原则上,ScheduledExecutorService接口在池大小问题上保持沉默,而JDK中使用的它的实际实现使用一个固定池:
类ScheduledThreadPoolExecutor
虽然这个类继承自ThreadPoolExecutor,但是一些继承的调优方法对它并不有用。特别是,由于它作为一个固定大小的池使用corePoolSize线程和一个无界队列,因此对maximumPoolSize的调整没有什么有用的效果。
显然,如果您使用应用程序框架或不同供应商提供的ScheduledExecutorService的不同实现,则这可能不成立。
发布于 2011-05-17 22:22:31
是的,在线程池大小方面,它们是完全相同的:它们最终,双方都呼吁相同的ThreadPoolExecutor构造函数。
https://stackoverflow.com/questions/6037693
复制相似问题