【发布时间】:2013-04-21 13:04:33
【问题描述】:
我正在使用线程池来使多个不重要的任务排队并(可能)执行,但是我需要能够轻松取消所有排队和正在执行的任务,并从头开始一个新队列。
即:
// startup
pool = Executors.newFixedThreadPool(5);
// reset
pool.shutdownNow();
pool = Executors.newFixedThreadPool(5);
我现在使用的实现似乎可以工作,但我不确定完全关闭并创建新线程池是否特别有效。
重置会定期发生,在某些用途中,它会像安排任务一样定期发生!由于无法确定是否有任何任务正在等待执行(或者是否存在?)我觉得我关闭池的方式过于频繁。
是否有更合适的池实现或更好的方法来实现此功能?
编辑:解决方案
我现在正在运行:
// startup
pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
// reset
for (Future<?> task : pool.getQueue().toArray(new Future[0]))
task.cancel(true);
我忽略了对“清除”的调用,因为这很慢,而且队列稍后会被池清理。我知道当前执行的任务可能不会因此而终止,这对我有用。
谢谢。
【问题讨论】:
-
如果您已经回答了您的问题,请将答案放在答案部分,而不是问题。
-
@NicolBolas 感谢您的反对和谴责。我使用了一个很有帮助的海报答案,但想澄清我的用法,以防将来对人们有所帮助。我不想通过用我从别人那里复制的东西来自我回答来为自己争取所有的荣耀。你们中的一些人太珍贵了,这确实有损于使用网络上最有用的资源。为什么不将注意力转向真正需要帮助的帖子,而不是关注已经解决的好问题。祝你有美好的一天。
-
“我不想通过用我从别人那里复制的东西自我回答来为自己争取所有的荣耀。”然后发布您的答案并点赞/接受他们的。这不是关于“声称荣耀”;这是关于适当的组织。问题在顶部,答案在“答案”部分。这就是使它成为“有用资源”的原因。回答你自己的问题很好。 “为什么不把注意力转向真正需要帮助的帖子,而不是关注已经解决的好问题。”当你提出答案时,它就不再是一个“好问题”了i> 在里面。因此投反对票。
-
不同人的不同笔画。
标签: java concurrency threadpool