ScheduledThreadPoolExecutor
扩展了ThreadPoolExecutor
,但是使用较少的构造函数,ScheduledThreadPoolExecutor
提供了一个无限的delayQueue,因此,如果我提交太多任务,可能会导致jvm OOM,为什么不这样做呢?提供有限的队列并拒绝策略(无法提交新任务时拒绝)?
答案 0 :(得分:0)
为什么不提供有限的队列并拒绝策略(当无法提交新任务时拒绝)?
您需要询问设计师,但是他们决定不支持此建议的事实,他们认为这样做没有用。 (或者至少没有足够的用处证明额外的复杂性。)
还有另一个原因。 ScheduledThreadPoolExecutor
的实现取决于以正确顺序返回队列的元素。如果查看源代码,您将看到它为此使用了一个自定义队列类。有一条评论说:
使用自定义队列(
DelayedWorkQueue
),这是无界DelayQueue
的变体。与corePoolSize
相比,缺少容量限制以及maximumPoolSize
和delayedExecute
实际上相同的事实简化了某些执行机制(请参阅ThreadPoolExecutor
)。
此外,很明显,延迟队列实现必须具有特定的操作属性,以使执行程序能够正确有效地工作。这可能就是为什么他们不允许您提供自己的队列实现的原因。
最后,如果希望您的应用程序对延迟队列大小施加限制,则可以在计划新任务之前使用yourPool.getQueue().length()
检查队列长度。