Кто прерывает мой тред?

Я понимаю, что делает InterruptedException и почему оно выбрасывается. Однако в моем приложении я получаю его, ожидая SwingUtilities.invokeAndWait() в потоке, известном только моему приложению, и мое приложение никогда не вызывает Thread.interrupt() ни в одном потоке, а также никогда никому не передает ссылку на поток.

Итак, мой вопрос: кто прерывает мою ветку?

Есть ли способ сказать? Есть ли причина, по которой InterruptedException не содержит имя потока, запрашивающего прерывание?

Я читал, что это может быть фреймворк или библиотека, мы используем следующее, но я не могу придумать причину, по которой они могут прервать мой поток:

  • Спящий режим
  • Весна
  • Лог4Дж
  • Соединитель MySQL

person Thirler    schedule 19.03.2010    source источник
comment
Я думаю, вы имеете в виду, кто ОСМЕЕТ прерывать мою беседу?   -  person Scott Smith    schedule 19.03.2010
comment
+1 - Вы делаете Thread#join? он выдает InterruptedException.   -  person RubyDubee    schedule 19.03.2010
comment
Действительно, Скотт, я бы предпочел, чтобы мои потоки не прерывались (потому что я все равно не хочу выполнять запрос). Мы сами не используем Thread#join, но я могу представить, что invokeAndWait использует такой механизм. Однако вызовет ли Thead#join прерывание в другом потоке? Также я почти уверен, что никто не ждет завершения моего потока (так как он никогда не будет).   -  person Thirler    schedule 19.03.2010
comment
Thread.dumpStacktrace() не помогает???   -  person Santhosh Kumar Tekuri    schedule 19.03.2010
comment
Текущий поток не выполняет прерывание, поэтому dumpStackTrace не должен давать мне нужную мне информацию. Трассировка стека из исключения показывает, что это происходит в Object.wait()   -  person Thirler    schedule 19.03.2010


Ответы (3)


Если возможно, вы можете расширить Thread и перезаписать метод interrupt() для этого потока, чтобы распечатать трассировку стека или вызвать исключение неподдерживаемой операции.

Вы также можете использовать расширенный класс Thread для хранения ссылки на прерванный поток и прочитать ее, как только вы поймаете прерванное исключение.

person josefx    schedule 19.03.2010

В общем, если вы хотите знать, кто что-то делает, прикрепите отладчик, поставьте точку останова и готово. Не нужно гадать, если вы можете воспроизвести его!

В этом случае вы можете поставить точку останова на Thread.interrupt(). Если есть другие потоки, которые также прерываются (поэтому у вас есть «ложноположительные» попадания в точку останова), вы можете добавить условие точки останова (большинство IDE позволяют вам сделать это легко), например, проверив имя потока .

person Wouter Coekaerts    schedule 19.03.2010

Здесь есть что-то странное.

Из javadoc invokeAndWait выдается InterruptedException

если мы прерваны, ожидая, пока поток диспетчеризации событий завершит выполнение doRun.run()

Вы пытались увидеть, отправляет ли код, выполняемый в EDT, какое-либо исключение? Или сделайте код в том, что EDT пытается изменить некоторые переменные этого потока (я знаю, что этот термин не является «ортодоксальным» на языке Java, но я надеюсь, вы понимаете, что я имею в виду: любой код, подразумевающий синхронизацию, ожидание, присоединение,...

person Riduidel    schedule 19.03.2010
comment
Если Runnable, который мы ожидаем, выдает исключение, он должен выдать InvocationTargetException, что не так. Возможно, наши потоки блокируются во время ожидания, может ли это быть причиной? Я уверен, что у нас нет тупика. Поток, которого мы ждем, создает диалог, который мы используем в ожидающем потоке. - person Thirler; 19.03.2010