Java 等待在将来完成任务抛出中断异常
我已经在网上搜索了一个星期了,但是没有一个帖子像我这样 似乎回答了我的问题。我已从我的代码中提取了一个代码示例:Java 等待在将来完成任务抛出中断异常,java,multithreading,interrupt,future,executorservice,Java,Multithreading,Interrupt,Future,Executorservice,我已经在网上搜索了一个星期了,但是没有一个帖子像我这样 似乎回答了我的问题。我已从我的代码中提取了一个代码示例: Future<Object> result = executorService.submit(new Callable<Object>() { @Override public Object call() throws Exception { ........... } }); try { return resul
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);
}
第83行是上面代码示例中显示的未来任务的result.get()
现在我的问题是,将来调用result.cancel(true)会导致result.get中的InterruptedException吗?如果没有,谁可以更改我当前线程的中断状态?AFAIK result.get()与运行我正在取消的已提交任务的线程不同。从Javadoc:
boolean取消(boolean可能中断frunning)
试图取消此任务的执行。如果任务已完成、已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且调用cancel时此任务尚未启动,则此任务不应运行。如果任务已经启动,则maybruptfrunning
参数确定执行此任务的线程是否应该中断以尝试停止任务
此方法返回后,对isDone()
的后续调用将始终返回true。如果此方法返回true,则对isCancelled()
的后续调用将始终返回true
因此,如果设置了MayInterruptfRunning
,则是,它将尝试中断运行任务的线程
换句话说,.cancel(true)
将尝试中断正在运行的任务,.cancel(false)
不会
听起来好像
result.get()
在调用时仍然会被中断。取消(false)
并且任务还没有开始。谢谢大家的输入。经过这么多的挖掘,我终于找到了答案
这是一个服务器端代码,故障出现在客户端代码中,如果服务器在指定的时间限制内未返回结果,则客户端代码会中断服务器。当然,客户端的时间限制小于服务器的超时限制
虽然他们正在捕获从服务器抛出的中断异常,但由于服务器正在使用动态代理,此异常被包装在未声明的HrowableException下。Cancel不应导致中断异常,因为行号表示对result.get()的调用。@AndyDufresne No,这是中断线程的调用堆栈。它没有告诉您中断来自何处。@AndyDufresne:我不太确定,因为在将来的线程中发生的异常会被传递到
get()
方法调用。这就是为什么即使此方法不返回任何内容也应该调用它的原因之一。@hoverCraftFullOfels-如果我的理解不正确,请更正我-上面的代码段缺少InterruptedException的catch块,但是假设它与TimeOutException相同,结果会如何。cancel()方法调用在同一线程中导致中断?从您发布的代码片段中,由于cancel
而无法获得InterruptedException
,因为在抛出InterruptedException
时您没有调用cancel
。或者反过来,如果在捕获中调用取消
(TimeoutException…
block,你不能在get
中获得InterruptedException
,因为get
已经完成了TimeoutException
。显然,InterruptedException
的原因在于你没有在这里发布的一段代码。我已经读过了。但是当我签出waitdone它正在检查Thread.interrupted(),这意味着当前线程,而不是结果为的运行线程。cancel()将中断。
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)