java - 如何在中断时返回结果,即如何检索 Callable 的结果,尽管它已被取消

标签 java optimization interrupt future callable

我整晚都对这个问题感到绝望,并且在网上研究期间没有找到帮助,所以我们开始吧。

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

我的想法是将计算放入可调用中。因为 Callables 可以返回结果,而且 - 至少我认为 - 也可以被中断。当抛出中断时,我的 call() 方法将能够返回最佳结果。但显然,强制中断 Callable 的唯一方法是执行 task.cancel(true); ,然后在 result = task.get(); 之前抛出 CancellationException > 可以检索结果。

我的代码的粗略草图:

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 获取此结果并且实际上应该返回它。

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

最佳答案

因此,有一个线程执行计算;该线程被中断,“最佳结果”就是它所能得出的结果。

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

然后您可以将该可运行对象提交到您的线程池;当它“完成其工作”(无论是真正完成还是被中断)时,您只需读取作为参数传递给 Runnable 的引用中的数据即可。

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

关于java - 如何在中断时返回结果,即如何检索 Callable 的结果,尽管它已被取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17129275/

相关文章:

java - 将 arraylist 添加到 Jlist

java - @InjectMocks 的等效方法

php - 在每个页面的页脚中使用 mysqli_close 有什么缺点吗?

linux - linux (arm) 中的 GPIO pin 中断处理程序

java - 在 JDeveloper 10 中针对 Java 7 进行编译

java - 在 Java 中使用 JXL 复制工作表

php - 导入后优化MySQL表

css - 如何避免对每个 TinyMCE 实例发出 content.css 请求?

c - Arduino定时器中断采样

java - 为什么interrupt()会快速连续中断两个线程?