Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待在将来完成任务抛出中断异常_Java_Multithreading_Interrupt_Future_Executorservice - Fatal编程技术网

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)