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