我有一个关于
ThreadPoolExecutor的这个相当简单的问题。我有以下情况:我必须从队列中使用对象,为他们创建适当的工作任务并将其提交到ThreadPoolExecutor。这很简单但是在关闭情况下,许多工作人员可能排队执行。因为这些任务之一可能运行了一个小时,而且我想要相对快速地关闭该应用程序,我想从ThreadPoolExecutor中丢弃所有排队的任务,而已经处理的任务应该正常完成。
ThreadPoolExecutor文档具有remove()方法,但仅允许删除特定任务。 purge()只适用于已经取消的未来任务。我的想法是清除队列中所有排队的任务。 ThreadPoolExecutor提供对此内部队列的访问,但文档规定:
Method getQueue() allows access to the
work queue for purposes of monitoring
and debugging. Use of this method
for any other purpose is strongly
discouraged.
所以抓住这个队列并清除它不是一个选择。此外,该文档的这段代码说:
Two supplied methods,
remove(java.lang.Runnable) and purge()
are available to assist in storage
reclamation when large numbers of
queued tasks become cancelled.
怎么样?当然,我可以维护我提交给执行程序的所有任务的列表,在关闭的情况下,我会遍历所有条目,并使用remove()方法将其从ThreadPoolExecutor中删除,但…来了,这是一个浪费记忆和麻烦维护这个清单。 (例如,删除已执行的任务)
我感谢任何提示或解决方案!