Не думаю, что есть основания для беспокойства:
1) InterruptedException (например, через Thread # interrupt ())
Вызов Thread.interrupt()
не вызывает самопроизвольного выброса InterruptedException
. Исключение возникает только в определенных (и хорошо документированных) методах блокировки; т.е. блокировка ввода / вывода и методы синхронизации. Это исключение не может быть сгенерировано после возврата из потокового конструктора и перед входом в блок try.
или исключение OutOfMemoryError выбрасывается
Если выдается OutOfMemoryError
, вы не можете гарантировать полное восстановление базового файлового дескриптора, независимо от того, куда вы поместили конструктор потока. Вы никогда не должны пытаться восстанавливаться из OOM, поэтому вопрос о том, закрыт ли поток, является спорным. Кроме того, это исключение создается только в потоке, который на самом деле пытается выделить память, и на данный момент этого не происходит.
2) JVM завершает работу (например, через kill, System.exit ())
Если приложение принудительно завершается внешним вызовом kill
или System.exit()
, не имеет значения, правильно ли закрыты потоки. Кроме того, в обоих случаях нет гарантии, что пункты finally будут выполнены.
3) Аппаратный сбой (или ошибка в JVM для полного списка:)
Все ставки сняты. У вас нет возможности узнать, выполнится ли что-нибудь, не говоря уже о блоках finally.
Существует еще одна ситуация, когда поток может получить спонтанное исключение в этот момент с некоторым (наивным) ожиданием, что он может восстановиться. Именно тогда какой-то заблуждающийся программист решает вызвать устаревший метод Thread.stop()
. Вы можете подумать, что размещение вызова конструктора потока внутри блока try
поможет. Но на самом деле это не так, потому что исключение ThreadDeath
может быть вызвано внутри конструктора потока между открытием базового файла и завершением создания объекта потока. Так что FD может протечь в любом случае.
Это одна из причин, по которой Thread.stop()
устарела. Не используйте его.