我正在编写Java Fractal Explorer,并且分形计算是多线程完成的。以前,我刚刚创建了一堆线程(尽可能多的系统有处理器内核)并将它们保存在一个数组中,但这会导致一些问题并且不是很优雅,现在我想切换到Executors。
我需要的功能是:
我的问题是Java ExecutorService(我使用Executors.newFixedThreadPool())在调用shutdownNow()(取消)后提交新任务时抛出异常。我当然可以创建一个新的ExecutorService,但是然后必须再次创建所有线程,据我所知,这是非常昂贵的(这是使用线程池的重点)。
基本上我需要的是一个使用线程池的ExecutorService实现,可以在不关闭它的情况下取消它,因此可以重用它。
是否已经有这样的事情或者我必须自己写吗? (不能太难,对吧?;))
我目前的代码可以在https://github.com/lucaswerkmeister/JFractalizer找到。
提前致谢,
卢卡斯
PS:当使用执行程序时,我会将图像分割成比线程更多的部分,因此如果一个部分完成得更快,则线程不会空闲,而是可以继续在图像的另一部分上。如果所有部分都是平行计算的,而不是一些比其他部分晚开始,那将是很酷的,但这只是一个奖励。
答案 0 :(得分:2)
完成ExecutorService
后,您应该使用ExecutorService.html#shutdownNow()
,并且不打算向其提交新任务。
如果您想继续使用相同的ExecutorService
,则应取消各个任务。
方法ExecutorService.html#submit
返回Future
,可用于取消执行和/或等待完成。
答案 1 :(得分:1)
您的任务应该能够处理中断。所以你可以通过打断任务取消任务。
boolean flag = Thread.interrupted();
if(flag == true )
throw new InterruptedException();