删除ThreadPoolExecutor的所有排队任务
我对ThreadPoolExecutor有一个非常简单的问题。我有以下情况:我必须使用队列中的对象,为它们创建适当的工作程序任务,然后将其提交给ThreadPoolExecutor。这很简单。但是在关闭情况下,
工作人员可能会排队等待执行。由于这些任务之一可能正在运行一个小时,而且我希望相对快速地正常关闭应用程序,因此我想从ThreadPoolExecutor中丢弃所有排队的任务,而已处理的任务应正常完成。
ThreadPoolExecutor文档具有remove()方法,但仅允许删除特定任务。purge()仅适用于已取消的Future任务。我的想法是清除容纳所有排队任务的队列。ThreadPoolExecutor提供对此内部队列的访问,但文档指出:
方法getQueue()允许访问工作队列,以进行监视和调试。强烈建议不要将此方法用于任何其他目的。
因此,抓住这个队列并清除它不是一个选择。此外,此文档的片段说明:
当取消大量排队的任务时,可以使用提供的两个方法remove(java.lang.Runnable)和purge()来辅助存储回收。
怎么样?当然,我可以维护提交给执行程序的所有任务的列表,在关机的情况下,我可以遍历所有条目并使用remove()方法将它们从ThreadPoolExecutor中删除…但是…来吧,这是一个浪费内存和维护此列表的麻烦。(例如,删除已经执行的任务)
我感谢任何提示或解决方案!
回答:
您是否考虑过包装ExecutorService?创建一个
CleanShutdownExecutorService implements Executor
将所有呼叫委托给另一位执行者,但将期货保留在其自己的列表中。CleanShutdownExecutorService然后可以具有cancelRemainingTasks()方法,该方法调用shutdown(),然后对其列表中的所有Future调用cancel(false)。
以上是 删除ThreadPoolExecutor的所有排队任务 的全部内容, 来源链接: utcz.com/qa/415866.html