我有一个相当简单的问题线程池执行器 http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html。我遇到以下情况:我必须使用队列中的对象,为它们创建适当的工作任务并将它们提交到 ThreadPoolExecutor。这很简单。但在关闭情况下many工作人员可能会排队等待执行。由于其中一个任务可能会运行一个小时,并且我希望应用程序能够相对快速地正常关闭,因此我想丢弃 ThreadPoolExecutor 中的所有排队任务,而已经处理的任务应该正常完成。
ThreadPoolExecutor 文档有一个remove() http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#remove(java.lang.Runnable)方法,但只允许删除特定任务。purge() http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#purge()仅适用于已取消的未来任务。我的想法是清除保存所有排队任务的队列。 ThreadPoolExecutor 提供了对此内部队列的访问,但文档指出:
方法 getQueue() 允许访问
用于监控目的的工作队列
和调试。使用该方法
出于任何其他目的强烈
灰心。
所以抓住这个队列并清除它不是一个选择。另外,文档的这个片段说:
提供的两种方法,
删除(java.lang.Runnable)和清除()
可协助存储
大量回收时
排队的任务被取消。
如何?当然,我可以维护提交给执行器的所有任务的列表,并且在关闭情况下,我迭代所有条目并使用remove()方法将它们从ThreadPoolExecutor中删除...但是...来吧,这是一个浪费内存并且维护此列表很麻烦。 (例如删除已执行的任务)
我很感激任何提示或解决方案!
我曾经开发过一个具有长时间运行线程的应用程序。我们在关机时执行此操作,
BlockingQueue<Runnable> queue = threadPool.getQueue();
List<Runnable> list = new ArrayList<Runnable>();
int tasks = queue.drainTo(list);
该列表将保存到文件中。启动时,列表会添加回池中,这样我们就不会丢失任何作业。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)