我正在使用线程池来使多个不重要的任务排队并(可能)执行但是我需要能够轻松取消所有排队和执行的任务并从头开始一个新队列。
IE:
// 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);
我忽略了对“清除”的调用,因为这很慢,而且队列稍后会被池清理。我知道当前执行的任务可能不会因此而终止,这对我有用。
谢谢。