为什么ScheduledThreadPoolExecutor不提供有限队列?

时间:2019-03-30 07:08:24

标签: java concurrency

ScheduledThreadPoolExecutor扩展了ThreadPoolExecutor,但是使用较少的构造函数,ScheduledThreadPoolExecutor提供了一个无限的delayQueue,因此,如果我提交太多任务,可能会导致jvm OOM,为什么不这样做呢?提供有限的队列并拒绝策略(无法提交新任务时拒绝)?

1 个答案:

答案 0 :(得分:0)

  

为什么不提供有限的队列并拒绝策略(当无法提交新任务时拒绝)?

您需要询问设计师,但是他们决定不支持此建议的事实,他们认为这样做没有用。 (或者至少没有足够的用处证明额外的复杂性。)

还有另一个原因。 ScheduledThreadPoolExecutor的实现取决于以正确顺序返回队列的元素。如果查看源代码,您将看到它为此使用了一个自定义队列类。有一条评论说:

  

使用自定义队列(DelayedWorkQueue),这是无界DelayQueue的变体。与corePoolSize相比,缺少容量限制以及maximumPoolSizedelayedExecute实际上相同的事实简化了某些执行机制(请参阅ThreadPoolExecutor)。

此外,很明显,延迟队列实现必须具有特定的操作属性,以使执行程序能够正确有效地工作。这可能就是为什么他们不允许您提供自己的队列实现的原因。

最后,如果希望您的应用程序对延迟队列大小施加限制,则可以在计划新任务之前使用yourPool.getQueue().length()检查队列长度。