Прерывание работающего в пуле потоков исполнителя - PullRequest
0 голосов
/ 08 октября 2018

Предположим, я запустил 10 потоков, используя executor Framework в Java.Я хочу остановить / прервать вызовы на основе определенных условий позже.Каков наилучший способ сделать это.Я понимаю future.cancel (правда), не решает проблему.

1 Ответ

0 голосов
/ 08 октября 2018

Отметьте эту статью.

Вызов shutdownNow () или cancel () не останавливает текущий работоспособный объект.Эти методы просто вызывают .interrupt () в соответствующем потоке (ах).Проблема в том, что ваш runnable не обрабатывает InterruptedException (и не может).Это довольно распространенная проблема, описанная во многих книгах и статьях, но все же она немного нелогична.

Чтобы сделать это, вам нужно сделать немало вещей.

  • Расширить Runnable
  • Сделать «отменяемые» ресурсы (например, входной поток) полем экземпляра, который обеспечивает метод отмены для вашего расширенного Runnableгде вы получаете ресурс «cancellable» и отменяете его (например, вызываете inputStream.close ())
  • Реализуйте пользовательский ThreadFactory, который, в свою очередь, создает пользовательские экземпляры Thread, которые переопределяют interrupt ()метод и вызовите метод cancel () в расширенном Runnable
  • Создание экземпляра исполнителя с помощью фабрики пользовательских потоков (статические методы фабрики принимают его в качестве аргумента)
  • Обработка внезапного закрытия / остановки / отключения ваших ресурсов блокировки в методе run ()
...