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