【问题标题】:Is there a way to cancel and reuse an ExecutorService?有没有办法取消和重用 ExecutorService?
【发布时间】:2012-11-20 05:44:37
【问题描述】:

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

我需要的功能是:

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

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

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

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

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

提前致谢,

卢卡斯

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

【问题讨论】:

  • shutdownNow 和取消不一样,你应该取消提交runnable/callable给executor服务时返回的future。除非您打算不再提交任何任务,否则不应调用 shutdown 或 shutdownNow。
  • 为什么不取消单个任务而不是关闭整个ExecutorService?
  • 谢谢你们。我完全忘记了,甚至还有期货之类的东西,当然可以让我取消单个任务。

标签: java multithreading threadpool executorservice executor


【解决方案1】:

当你用完ExecutorService并且你不打算向它提交新任务时,你应该使用ExecutorService.html#shutdownNow()

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

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

【讨论】:

    【解决方案2】:

    您的任务应该能够处理中断。所以你可以通过打断他们来取消任务。

      boolean flag = Thread.interrupted();
      if(flag == true )
          throw new InterruptedException();
    

    【讨论】:

    • 我只是返回而不是抛出异常,可以吗?
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多