0

我必须使用线程池运行线程。我使用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 的代码中设置了中断标志。但不幸的是,中断异常没有被捕获,我找不到原因。任何想法?

4

2 回答 2

0

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

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

如果你想检查任务是否被中断,那么你应该Thread.currentThread().isInterrupted()在任务代码中使用。 您通常通过调用来中断任务futureTask.cancel(true)。如果任务尚未执行,这将停止任务运行。如果它当前正在运行,那么您将需要测试代码中的中断位。就像是:

// your task should do something like this if you have a while loop
while (!Thread.currentThread().isInterrupted()) {
    ...
}
于 2013-09-23T15:57:30.330 回答
0

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

于 2013-09-23T16:16:07.337 回答