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