java - 如何有效地重置线程池

标签 java concurrency threadpool

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

即:

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

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

谢谢。

最佳答案

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

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

关于java - 如何有效地重置线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125582/

相关文章:

Go网络爬虫卡住了

java - hibernate 线程何时在 Java 中继续执行?

java - 不断向 ExecutorService 提交 Runnable 任务,直到工作完成,得到 java.util.concurrent.RejectedExecutionException

java - 在没有maven的多模块J2EE Web项目中配置log4j2

java - 使用 SQLite4Java 创建新数据库

concurrency - Erlang类(class)并发练习: Can my answer be improved?

java - 预初始化工作线程池以重用连接对象(套接字)

wcf - 我陷入僵局了吗?为什么?

java - 如何知道应用程序是否仍然与编辑器中的当前代码保持同步?

java - ClassCastException 是 System.out.println