如何重置 executorservice.invokeAll() 中的中断标志

How to reset interrupted flag in executorservice.invokeAll()

我了解到在捕获到 InterruptedException 后将 Thread.interrupter() 标志设置回 true 是一种很好的做法。

然而,当我调用 executorService.invokeAll() 并在其周围放置一个 try 子句时,通过捕获 InterruptedException,Thread.currentThread().interrupt() 将正确标记中断线程或我的 controller/runner 的主线程?

public class Controller {

    public void run() {

        final List<Task> tasks = request.collectTasks()

        try {
            executorService.invokeAll(tasks);
        } catch (InterruptedException e) {
            message = "interrupted";
            Thread.currentThread().interrupt();
            throw new InternalFailureException(message);
        }
    }
}

class Task implements Callable<String> {
      @Override
      public String call() {
          return taskId;
      }
}

总的来说,这是重置中断标志的正确方法吗?

在此代码示例中,您已给出

try {
       executorService.invokeAll(tasks);
    } catch (InterruptedException e) {
        message = "interrupted";
        Thread.currentThread().interrupt();
        throw new InternalFailureException(message);
    }

调用 Thread.currentThread().interrupt(); 的任何人都将设置该线程的标志,在此示例中它将是执行您的 Controller#run() 方法的线程。

理想情况下,执行器由 TaskRunnable 负责,由执行器调度以正确处理此标志。

因为它已经是一个已检查的异常 - 它不会给您机会来装饰您将要在执行器中提交的任务,因此您无法轻松控制它。