我正在编写一个 Java Fractal Explorer,分形计算是多线程完成的。以前,我只是创建了一堆线程(与系统有处理器内核一样多)并将它们保存在一个数组中,但这会导致几个问题并且不是很优雅,现在我想切换到 Executors。
我需要的功能是:
- 用户可以随时选择分形图像的新区域进行放大,因此应该可以随时取消计算,并立即重新插入新任务
- 为了获得更好的性能,线程应该被重用(并且在取消后仍然存在)
我的问题是,当我在调用 shutdownNow()(取消)后提交新任务时,Java ExecutorService(我使用 Executors.newFixedThreadPool())会引发异常。我当然可以只创建一个新的 ExecutorService,但是必须再次创建所有线程,据我了解,这非常昂贵(这是使用线程池的全部意义)。
所以基本上我需要的是一个使用线程池的 ExecutorService 实现,可以在不关闭它的情况下取消它,所以它可以被重用。
已经有这样的东西还是我必须自己写?(不能太难,对吧?;))
我当前的代码可以在https://github.com/lucaswerkmeister/JFractalizer找到。
提前致谢,
卢卡斯
PS:当使用执行器时,我会将图像分割成比线程更多的部分,因此如果一个部分完成得更快,则线程不会空闲,而是可以继续处理图像的另一部分。尽管如此,如果所有部分都可以并行计算,而不是某些部分比其他部分开始晚,那将是很酷的,但这只是一个奖励。