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