Как сбросить прерванный флаг в executorservice.invokeAll () - PullRequest
0 голосов
/ 05 июня 2019

Я узнал, что рекомендуется установить флаг Thread.interrupter () обратно на true после перехвата InterruptedException.

Однако, когда я вызываю 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 голосов
/ 05 июня 2019

В этом примере кода вы дали

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

тот, кто вызывает Thread.currentThread().interrupt();, установит флаг этого потока, в этом примере это будет поток, выполняющий ваш Controller#run() метод.

В идеале с исполнителями ответственность за правильную обработку этого флага возлагается на Task или Runnable, который запланирован над исполнителем.

Поскольку это уже проверенное исключение - оно не даст вам возможности украсить задачу, которую вы собираетесь отправить внутри исполнителя, поэтому вы не можете легко ее контролировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...