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

时间:2019-06-05 00:10:42

标签: java executorservice

我了解到,在捕获InterruptedException之后,将Thread.interrupter()标志设置回true是一个好习惯。

但是,当我调用executorService.invokeAll()并在其周围放置try子句时,通过捕获InterruptedException,Thread.currentThread().interrupt()会正确地标记中断的线程还是控制器/运行程序的主线程吗?

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;
      }
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

理想情况下,TaskRunnable的职责是由执行者安排在执行者上以正确处理此标志。

由于已经是一个已检查的异常-它不会让您有机会装饰要在执行程序内提交的任务,因此您无法轻松控制它。