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