我正在寻找一种方法来告诉这个电话,大约需要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,但仍然如何停止这行代码?
最佳答案 Java中的线程中断是合作的.
但我相信你理解这一点.如果您的仿射变换需要很长时间才能运行并且您尝试在一次运行中运行它,甚至没有检查中断的标志,您的变换将很快转换.
没有Thread.kill().
你没有选择.请注意,我不知道是否可能,但理想情况下,应将这样一个长时间运行的线程拼接成可管理的可及时块,并在这些块之间检查中断标志.
当然,您也可以选择不在当前线程中运行该转换,而是在ExecutorService中运行,并获取结果的Future;你会.get()超时.
但最终的问题仍然存在:你必须检查中断标志.而且你将不得不在.get()上处理TimeoutException.
好的,我吮吸数学.但这个转换不能分成几个线程吗?你不能使用fork / join框架吗?或者更好的是,如果您使用Java 8,Stream和收集器?