Правильный выбор по умолчанию - добавить InterruptedException в ваш список бросков.Прерывание указывает, что другой поток желает, чтобы ваш поток завершился.Причина этого запроса не очевидна и полностью контекстуальна, поэтому, если у вас нет никаких дополнительных знаний, вы должны предполагать, что это просто дружественное завершение работы, а все, что позволяет избежать такого выключения, является неприемлемым ответом.
Java не будет случайным образом выбрасывать InterruptedException, все советы не будут влиять на ваше приложение, но я столкнулся со случаем, когда следование стратегии «ласточки» разработчика стало очень неудобным.Команда разработала большой набор тестов и много использовала Thread.Sleep.Теперь мы начали запускать тесты на нашем CI-сервере, и иногда из-за дефектов в коде застревали в постоянном ожидании.Что еще хуже, при попытке отменить задание CI оно никогда не закрывалось, поскольку прерывание Thread.Interrupt, предназначенное для прерывания теста, не прерывало задание.Нам пришлось войти в систему и вручную убить процессы.
Короче говоря, если вы просто выбросите InterruptedException, то вы соответствуете намерению по умолчанию, что ваш поток должен завершиться.Если вы не можете добавить InterruptedException в свой список бросков, я поместил бы его в RuntimeException.
Существует очень рациональный аргумент в пользу того, что InterruptedException должен быть сам по себе RuntimeException, поскольку это будет способствовать лучшей обработке по умолчанию.Это не RuntimeException только потому, что разработчики придерживались категориального правила, согласно которому RuntimeException должно представлять ошибку в вашем коде.Поскольку InterruptedException не возникает непосредственно из-за ошибки в вашем коде, это не так.Но реальность такова, что часто возникает InterruptedException, потому что в вашем коде есть ошибка (т. Е. Бесконечный цикл, тупиковая блокировка), а Interrupt - это метод другого потока для решения этой ошибки.
Если вызнайте, что рациональная очистка должна быть сделана, тогда сделайте это.Если вам известна более глубокая причина прерывания, вы можете взять более полную обработку.
Таким образом, в итоге ваш выбор для обработки должен следовать этому списку:
- По умолчанию добавьте кthrows.
- Если не разрешено добавлять к броскам, бросить RuntimeException (e). (лучший выбор из нескольких плохих опций)
- Только когда вы знаете явную причину прерывания, обрабатывайте по желанию.Если ваша обработка является локальной для вашего метода, тогда сброс прерывается прерыванием вызова Thread.currentThread (). Interrupt ().