java - 有没有办法取消并重用ExecutorService?

标签 java multithreading threadpool executorservice executor

我正在编写一个Java Fractal Explorer,分形计算是多线程完成的。以前,我只是创建了一堆线程(与系统有处理器核心一样多)并将它们保存在一个数组中,但这会导致一些问题并且不是很优雅,现在我想切换到Executors。

我需要的功能是:

  • 用户可以随时选择分形图像的新区域进行放大,因此应该可以随时取消计算,并立即重新插入新任务
  • 为了获得更好的性能,线程应该被重用(并在取消后继续存在)

我的问题是,当我在调用 shutdownNow() (取消)后提交新任务时,Java ExecutorService(我使用 Executors.newFixedThreadPool())会引发异常。我当然可以创建一个新的 ExecutorService,但随后所有线程都必须再次创建,据我所知,这是相当昂贵的(这就是使用线程池的全部意义)。

所以基本上我需要的是一个使用线程池的 ExecutorService 实现,它可以在不关闭的情况下取消,因此可以重用。

已经有这样的东西了还是我必须自己写? (不会太难吧?;))

我当前的代码可以在 https://github.com/lucaswerkmeister/JFractalizer 找到.

提前致谢,

卢卡斯

PS:当使用执行器时,我会将图像分割成比线程更多的部分,因此如果一个部分完成得更快,则线程不会空闲,而是可以继续处理图像的另一部分。如果所有部分都可以并行计算,而不是某些部分比其他部分晚开始,那就太酷了,但这只是一个好处。

最佳答案

您应该使用ExecutorService.html#shutdownNow()当您完成 ExecutorService 并且您不打算向其提交新任务时。

如果您想继续使用相同的ExecutorService,您应该取消各个任务。

方法ExecutorService.html#submit返回Future可用于取消执行和/或等待完成。

关于java - 有没有办法取消并重用ExecutorService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671739/

相关文章:

java - Java 中的执行器和守护进程

java - 如何理解 spring boot 应用程序已准备好工作?

c++11 - Boost asio thread_pool join 不等待任务完成

java - 检查或未检查异常

java - 调度程序可以覆盖加入功能吗?

java - 如何从脚本中分析 Java 线程状态摘要

c - 我如何在 C 中为 Windows 创建多线程?

java - 哈希表、ConcurrentHashMap 和数据可见性

java - 如何从网络服务器异步下载图片

c# - 等待异步方法在后台做什么?