Механизм прерывания потока является предпочтительным способом заставить (взаимодействующий) поток ответить на запрос, чтобы остановить то, что он делает. Любой поток (включая сам поток, я думаю) может вызвать interrupt()
в потоке.
На практике обычные сценарии использования для interrupt()
включают в себя какую-то платформу или менеджер, говорящий некоторому рабочему потоку прекратить то, что они делают. Если рабочий поток «осведомлен о прерывании», он заметит, что он был прерван из-за исключения или путем периодической проверки его флага прерывания. Заметив, что это было прервано, хорошо ведущий себя поток откажется от того, что он делает, и завершит себя.
Принимая во внимание приведенный выше вариант использования, ваш код, скорее всего, будет прерван, если он будет запущен в среде Java или из какого-либо рабочего потока. И когда он прерван, ваш код должен отказаться от того, что он делает, и заставить себя завершиться наиболее подходящим способом. В зависимости от того, как был вызван ваш код, это может быть сделано путем возврата или выдачи какого-либо подходящего исключения. Но это, вероятно, не следует называть System.exit()
. (Ваше приложение не обязательно знает, почему оно было прервано, и оно, конечно, не знает, существуют ли другие потоки, которые должны быть прерваны платформой.)
С другой стороны, если ваш код не предназначен для работы под управлением какой-либо платформы, вы можете утверждать, что InterruptedException
является неожиданным исключением; то есть ошибка. В этом случае вы должны обработать исключение так же, как и другие ошибки; например оберните его в непроверенное исключение, перехватите и зарегистрируйте его в тот же момент, когда вы работаете с другими неожиданными непроверенными исключениями. (Как вариант, ваше приложение может просто игнорировать прерывание и продолжать делать то, что оно делало.)
1) Если я сам никогда не прерываю другие потоки, что может вызвать InterruptedException?
Один пример, если ваши Runnable
объекты выполняются с использованием ExecutorService
и shutdownNow()
вызывается в службе. И теоретически любой сторонний пул потоков или инфраструктура управления потоками могут на законных основаниях делать что-то подобное.
2) Если я никогда не прерываю другие потоки самостоятельно, используя interrupt () ... что тогда означает InterruptedException
? Что я должен делать, когда поймал его? Выключить мое приложение?
Вам необходимо проанализировать кодовую базу, чтобы выяснить, что делает вызовы interrupt()
и почему. Как только вы поняли это, вы можете понять, что >> нужно делать вашей << части приложения. </p>
Пока вы не знаете, почему выбрасывается InterruptedException
, я бы посоветовал трактовать это как серьезную ошибку; например напечатайте трассировку стека в файл журнала и закройте приложение. (Очевидно, что это не всегда правильный ответ ... но дело в том, что это «ошибка», и о ней нужно сообщить вниманию разработчика / сопровождающего.)
3) Как мне узнать, кто / что звонит interrupt()
?
Нет хорошего ответа на это. Лучшее, что я могу предложить, - это установить точку останова на Thread.interrupt()
и посмотреть на стек вызовов.