我正在寻找一种方法来告诉这个电话,大约需要20-120秒:
final Area image = ...
final AffineTransform transform = new AffineTransform();
transform.scale...
image.transform(transform); //this specific line takes that long
如果调用Thread.interrupt(),停止;
因为我只想调用一次,我不能在一段时间内运行一些东西(Thread.currentThread.isInterrupted())循环并抛出InterruptedException。如果在调用之前和之后isNotInterrupted,我可以运行,但仍然,如何停止这行代码?
答案 0 :(得分:2)
Java中的线程中断是合作的。
但我相信你理解这一点。如果您的仿射变换需要很长时间才能运行并且您尝试在一次运行中运行它,甚至没有检查中断的标志,那么您的变换将很快转换。
没有Thread.kill()
。
你别无选择。请注意,我不知道是否可能,但理想情况下,这样一个长时间运行的线程应该拼接成可管理的可及时块,并在这些块之间检查中断标志。
当然,你也可以选择不在当前线程中运行该变换,而是在ExecutorService
中运行,并获取结果的Future
;你会.get()
超时。
但最终问题仍将存在:您必须检查中断标志。您必须在TimeoutException
上处理.get()
。
Stream
和Collector
?