2

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

我需要的功能是:

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

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

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

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

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

提前致谢,

卢卡斯

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

4

2 回答 2

2

You should use ExecutorService.html#shutdownNow() when you're done with the ExecutorService and you don't intend to submit new tasks to it.

If you want to keep using the same ExecutorService, you should cancel the individual tasks.

Method ExecutorService.html#submit returns a Future that can be used to cancel execution and/or wait for completion.

于 2012-12-02T17:33:16.500 回答
1

您的任务应该能够处理中断。因此,您可以通过中断任务来取消任务。

  boolean flag = Thread.interrupted();
  if(flag == true )
      throw new InterruptedException();
于 2012-12-02T17:34:21.733 回答