1

我整夜都在这个问题上变得绝望,并且在在线研究期间我没有找到帮助,所以我们开始吧。

我想做一个优化过程,该过程意味着在运行时确定的时间被中断。引发中断后,我希望返回在那一刻之前计算出的最佳结果。

我的想法是将计算结果放入 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 得到了这个结果并且实际上应该返回它。

那么,我怎样才能在那里获得中断并仍然得到我的结果?还是有一些完全不同的方式来实现我最初的想法?

4

1 回答 1

0

因此,有一个线程执行计算;这个线程被打断了,“最好的结果”就是它可能想出的。

Callable然后,您可以使用 a代替aRunnable并在初始化时传递对承载结果的结构的引用。

然后,您可以将该可运行文件提交到您的线程池;当它“完成它的工作”时(它真的完成了,或者它被中断了),你只需要读取你Runnable作为参数传递给你的引用中的数据。

编辑由于计算的结果是 a( 对 a)n 对象的引用,我建议使用AtomicReference.

于 2013-06-16T01:20:30.930 回答