使用 ScheduledThreadPoolExecutor 进行界定队列的最佳方式是什么?

Sun Java (1.6) 是内部的扩展,它使用一个实现,它是一个无界队列。我需要的是一个有界队列,即它对队列中累积的任务有限制,以便当队列中的任务超过限制时,它开始拒绝进一步提交的任务并防止JVM内存不足。ScheduledThreadPoolExecutorThreadPoolExecutorDelayQueueScheduledThreadpoolExecutor

令人惊讶的是,google或stackoverflow并没有向我指出任何讨论这个问题的结果。有没有这样的东西已经可用,我错过了?如果没有,我如何实现一个 ScheduledThreadpoolExecutor 以最佳方式为我提供预期的功能?


答案 1

正如其他人已经指出的那样,没有现成的方法可以做到这一点。只要确保你尝试使用“组合”而不是“继承”。创建一个新类,该类实现必要的接口,并通过根据需要对必要的方法进行检查来委托给基础。ScheduledThreadPoolExecutor

您还可以通过简单的修改使用此线程中指定的技术。您可以使用 和 根据布尔结果决定是否需要调用拒绝处理程序,而不是使用 。想想看,我个人认为,库作者直接对特定执行器进行子类化是一种疏忽,而不是依靠组合来创建一个“可调度”的包装器而不是普通的执行器。Semaphore#acquireSemaphore#tryAcquire


答案 2

如何以不同的方式处理它,即根据队列大小延迟任务子任务。执行器服务通过 getQueue() 公开队列。您可以在其上调用 size(),并且根据您为队列大小计划的限制,您可以开始拒绝任务或开始延迟任务执行(增加计划时间,将队列的大小作为因素之一)。

总而言之,这又不是最好的解决方案;只是fyi,java提供了延迟队列来支持工作窃取。


推荐