Я понимаю то, что делает InterruptedException и почему он брошен. Однако в моем приложении я получаю его при ожидании SwingUtilities.invokeAndWait()
на потоке, который только известен моим приложением, и никогда не звонит мое приложение Thread.interrupt()
на любом потоке также это никогда не передает ссылку потока никому.
Таким образом, мой вопрос: Кто прерывает мой поток?
Там какой-либо путь состоит в том, чтобы сказать? Существует ли причина, почему InterruptedException не содержит название Потока, который запрашивает прерывание?
Я считал, что это могла быть платформа или библиотека, которая делает это, мы используем следующее, но я не могу думать о причине для них прервать мой поток:
Если возможно, вы можете расширить Thread
и перезаписать метод interrupt ()
для этого потока, чтобы распечатать stacktrace или вызвать исключение неподдерживаемой операции.
Вы также можете использовать расширенный класс Thread
, чтобы сохранить ссылку на прерывающий поток и прочитать ее, как только вы поймаете прерванное исключение.
Здесь есть что-то странное.
Из javadoc для invokeAndWait, InterruptedException
выбрасывается
если нас прерывают, пока мы ждем, пока поток диспетчеризации событий закончит выполнение doRun.run()
Вы пытались посмотреть, посылает ли код, выполняемый в EDT, какое-либо исключение? Или код в этом EDT пытается модифицировать некоторые переменные этого потока (я знаю, что этот термин не является "ортодоксальным" в языке java, но я надеюсь, вы понимаете, что я имею в виду: любой код, подразумевающий synchronized, wait, join, ...
В общем, если вы хотите узнать, кто что делает, подключите отладчик, поставьте точку останова, и вот вам пожалуйста. Нет необходимости гадать, если вы можете это воспроизвести!
В данном случае вы можете поставить точку останова на Thread.interrupt()
. Если есть другие потоки, которые тоже прерываются (так что у вас есть "ложные срабатывания" точки останова), вы можете добавить условие точки останова (большинство IDE позволяют сделать это легко), например, проверяя имя потока.