Java 我无法捕获FutureTask.get()方法的异常。FutureTask由Spring TaskExecutor启动

Java 我无法捕获FutureTask.get()方法的异常。FutureTask由Spring TaskExecutor启动,java,multithreading,spring,Java,Multithreading,Spring,我必须使用线程池运行线程。 我使用spring框架的TaskExecutor类。 我使用FutureTask类,因为我需要同步线程。 最后,代码如下所示: private TaskExecutor taskExecutor; FutureTask futureTask=new FutureTask(new MyTask()); taskExecutor.execute(futureTask); try { futureTask.get(); } catch (InterruptedExce

我必须使用线程池运行线程。 我使用spring框架的TaskExecutor类。 我使用FutureTask类,因为我需要同步线程。 最后,代码如下所示:

private TaskExecutor taskExecutor;

FutureTask futureTask=new FutureTask(new MyTask());
taskExecutor.execute(futureTask);
try {
  futureTask.get();
} catch (InterruptedException e) {
  e.printStackTrace();
} catch (ExecutionException e) {
  e.printStackTrace();
}
实际上,执行MyTask的线程可能会中断。在调试模式下,我可以看到在MyTask的代码中设置了中断标志。但不幸的是,被中断的异常没有被捕获,我找不到原因。有什么想法吗

我可以看到在MyTask的代码中设置了中断标志。但不幸的是,被中断的异常没有被捕获,我找不到原因。有什么想法吗

抛出
InterruptedException
的唯一时间是方法执行某种睡眠或等待(
Thread.sleep(…)
Object.wait(…)
,等等)时。在这种情况下,只有在调用
futureTask.get()
的线程被中断时才会抛出
InterruptedException
,而不是任务本身。调用
get()
的线程正在等待任务完成,因此任务可能会被中断

如果要检查任务是否已中断,则应在任务代码中使用
Thread.currentThread().isInterrupted()
。通常通过调用
futureTask.cancel(true)
来中断任务。如果任务尚未执行,这将停止任务运行。如果当前正在运行,则需要测试代码中的中断位。比如:

// your task should do something like this if you have a while loop
while (!Thread.currentThread().isInterrupted()) {
    ...
}

任务执行期间发生的任何异常(包括InterruptedException)都将导致ExecutionException(它们将被包装在其中)。可以抛出InterruptedException
仅当运行futureTask.get()的线程被中断时。

Hi Gray,现在已清除。我认为interrupedException是在创建的线程被中断时抛出的。实际上,这是调用线程被中断的时候。非常感谢你