我整夜都在这个问题上变得绝望,并且在在线研究期间我没有找到帮助,所以我们开始吧。
我想做一个优化过程,该过程意味着在运行时确定的时间被中断。引发中断后,我希望返回在那一刻之前计算出的最佳结果。
我的想法是将计算结果放入 Callable 中。因为 Callables 可以返回结果并且 - 至少我认为 - 被打断。我的 call() 方法将能够在引发中断时返回我的最佳结果。但显然,强制中断进入 Callable 的唯一方法是在可以检索结果task.cancel(true);
之前抛出 CancellationException 。result = task.get();
我的代码的粗略截图:
SearchCallable myCallable = new myCallable(...);
ExecutorService service = Executors.newFixedThreadPool(1);
Future<int[]> task = service.submit(myCallable);
try {
Thread.sleep(getTimeToCalculate(...));
} catch (InterruptedException e) {[...]}
task.cancel(true);
try {
result = task.get();
} catch(InterruptedException ie){[...]
} catch (ExecutionException ee) {[...]}
myCallable 看起来有点像这样:
public class myCallable implements Callable<Object> {
public myCallable(...){
[...]
}
public Object call(){
return anObjectOfAnotherClass.saidCalculations();
}
}
执行大量递归的辅助方法包含以下内容:
if(Thread.interrupted()){
throw new InterruptedException();
}
并且所说的辅助方法捕获了这个 InterruptedException 并返回了迄今为止最好的结果,所以 myCallable 得到了这个结果并且实际上应该返回它。
那么,我怎样才能在那里获得中断并仍然得到我的结果?还是有一些完全不同的方式来实现我最初的想法?