有没有办法取消和重用ExecutorService?

时间:2012-12-02 17:25:02

标签: java multithreading threadpool executorservice executor

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

我需要的功能是:

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

我的问题是Java ExecutorService(我使用Executors.newFixedThreadPool())在调用shutdownNow()(取消)后提交新任务时抛出异常。我当然可以创建一个新的ExecutorService,但是然后必须再次创建所有线程,据我所知,这是非常昂贵的(这是使用线程池的重点)。

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

是否已经有这样的事情或者我必须自己写吗? (不能太难,对吧?;))

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

提前致谢,

卢卡斯

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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