Java 我无法捕获FutureTask.get()方法的异常。FutureTask由Spring TaskExecutor启动
我必须使用线程池运行线程。 我使用spring框架的TaskExecutor类。 我使用FutureTask类,因为我需要同步线程。 最后,代码如下所示: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
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是在创建的线程被中断时抛出的。实际上,这是调用线程被中断的时候。非常感谢你