【发布时间】:2014-11-27 13:34:59
【问题描述】:
我已经在网上搜索了一个星期,但没有一个帖子喜欢 How do I get FutureTask to return after TimeoutException? 似乎回答了我的问题。我从我的代码中提取了一个代码示例:
Future<Object> result = executorService.submit(new Callable<Object>() {
@Override public Object call() throws Exception {
...........
}
});
try {
return result.get(timeout.getValue(), timeout.getUnit().getTimeUnit());
} catch (TimeoutException e) {
result.cancel(true);
throw new TTimeoutException(e);
}
如果我运行这个,有时(1000 分之一)我会得到 p>
java.lang.InterruptedException
at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
at java.util.concurrent.FutureTask.get(FutureTask.java:199)
at com.abc.callers.A.call(A.java:83)
第 83 行是上面代码示例中显示的未来任务的 result.get()。
现在我的问题是,将来调用 result.cancel(true) 会导致 result.get 中的 InterruptedException 吗?如果不是,谁能改变我当前线程的中断状态? AFAIK result.get() 与运行我正在取消的提交任务的线程不同..
【问题讨论】:
-
Cancel 不应导致 InterruptedException,因为行号表明调用了 result.get()。
-
@AndyDufresne 不,这是来自被中断线程的调用堆栈。它不会告诉你中断是从哪里来的。
-
@AndyDufresne:我不太确定这一点,因为未来线程中发生的异常会被引导到
get()方法调用。这就是为什么这个方法应该被调用的原因之一,即使它什么也不返回。 -
@HovercraftFullOfEels - 如果我的理解不正确,请纠正我 - 上面的代码 sn-p 缺少 InterruptedException 的 catch 块,但假设它与 TimeOutException 相同,result.cancel() 方法如何调用导致同一线程中的中断?
-
从您发布的代码中,由于
cancel的结果是不可能得到InterruptedException,因为当InterruptedException被抛出时您没有调用cancel。或者反过来说,如果您在catch (TimeoutException…块内调用cancel,您将无法在get中获得InterruptedException,因为get已经完成了TimeoutException。显然,InterruptedException的原因在于您在此处没有发布的一段代码。
标签: java multithreading interrupt future executorservice