ExecutorService - как прервать выполнение потоков, которые были вызваны из основного потока после исключения внутри одного из них - PullRequest
0 голосов
/ 22 марта 2019

У меня есть класс SomeService. Его методы могут быть вызваны из различных потоков (например, из RestController). Этот класс содержит ExecutorService и некоторые CustomClass.

public class SomeService {
   private ExecutorService service;
   private CustomClass customClass;

   public SomeService(ExecutorService service, CustomClass customClass){
       this.service = service;
       this.customClass = customClass;
   }

   public void servicePost() {
      CountDownLatch countDownLatch = new CountDownLatch(urls.size());
      for (String url : List<String> urls){
          service.submit(() -> {
              customClass.send(url);
              countDownLatch.countDown();
          });
      }
      countDownLatch.await();
   }
}

Я хочу выполнить customClass.send(url) параллельно в разных потоках, используя ExecutorService, но этот метод может выдать RuntimeException.

Например, я представил 5 заданий:
1. 2 задачи успешно выполнены
2. 2 задачи выполняются.
3. один из них выбрасывает RuntimeException.

Как прервать запущенные задачи?
p.s . ExecutorService может иметь задачи из других потоков. Я не хочу их прерывать.

1 Ответ

2 голосов
/ 22 марта 2019

Вы можете вызвать shutdownNow() в службе исполнителя, когда вы поймаете исключение, также вам нужно проверить Thread#interrupted() внутри задачи перед обработкой. Ваш код должен выглядеть примерно так:

service.submit(() -> {
        if (!Thread.interrupted()) {
            try {
                  customClass.send(url);
                  countDownLatch.countDown();
                } catch (Exception e) {
                   service.shutdownNow();
                }
        }

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