Кто прерывает мою нить?
Я понимаю, что делает InterruptedException и почему оно выбрано. Однако в моем приложении я получаю его, ожидая SwingUtilities.invokeAndWait()
в потоке, который известен только моему приложению, и мое приложение никогда не вызывает Thread.interrupt()
в любом потоке, также никогда не передает ссылку нить никому.
Итак, мой вопрос: кто прерывает мою нить?
Есть ли способ рассказать? Есть ли причина, по которой InterruptedException не содержит имя потока, запрашивающего прерывание?
Я читал, что это может быть фреймворк или библиотека, которые делают это, мы используем следующее, но я не могу придумать причины для прерывания моего потока:
- Hibernate
- Spring
- Log4J
- Разъем Mysql
Ответы
Ответ 1
Если возможно, вы можете расширить Thread
и перезаписать метод interrupt()
для этого потока для печати stacktrace или выброса неподдерживаемого исключения операции.
Вы также можете использовать расширенный класс Thread
для хранения ссылки на прерывающий поток и прочитать его, как только вы поймаете прерванное исключение.
Ответ 2
В общем, если вы хотите знать, кто что-то делает, присоедините отладчик, поставьте точку останова, и там вы идете. Не нужно угадывать, можете ли вы воспроизвести его!
В этом случае вы можете установить точку останова в Thread.interrupt()
. Если есть другие потоки, которые также прерываются (так что у вас есть "ложные положительные" удары в точке останова), вы можете добавить условие точки останова (большинство IDE позволяют это сделать легко), например, путем проверки имени потока.
Ответ 3
Здесь что-то странное.
Из javadoc invokeAndWait, InterruptedException
выбрано
если мы прерваны в ожидании завершения потока отправки событий doRun.run()
Вы пытались выяснить, отправляет ли код в EDT какое-либо исключение? Или код в том, что EDT пытается изменить некоторые из этих переменных потока (я знаю, что этот термин не является "ортодоксальным" на Java-языке, но, надеюсь, вы видите, что я имею в виду: любой код, подразумевающий синхронизацию, ожидание, объединение,...