4

我正在使用线程池来使多个不重要的任务排队并(可能)执行但是我需要能够轻松取消所有排队和执行的任务并从头开始一个新队列。

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);

我忽略了对“清除”的调用,因为这很慢,而且队列稍后会被池清理。我知道当前执行的任务可能不会因此而终止,这对我有用。

谢谢。

4

2 回答 2

0

您可以监视Future从提交任务中获得的所有 s 以及cancel()所有这些,这将允许您重新使用线程池而无需重新创建。但是,我怀疑你会获得太多额外的效率。

只要您不经常这样做,我认为您的机制应该可以正常工作。要意识到的一件事是,尽管您正在调用pool.shutdownNow(),但这只会中断正在运行的作业,而不一定会停止它们。这取决于他们在做什么以及他们是否正在执行InterruptedException经常抛出的方法或监听线程中断标志。所以即使shutdownNow()返回,一些任务可能仍在执行。

于 2013-04-20T21:58:26.897 回答
-2

您可以取消所有待处理(并且可能正在运行)的任务:

for (Future f: pool.getQueue().toArray(new Future[0]))
{
    f.cancel(true); // or false
}
pool.purge();
于 2013-04-20T22:00:46.300 回答