Кто прерывает мою тему? - PullRequest
12 голосов
/ 19 марта 2010

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

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

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

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

  • Hibernate
  • Весна
  • Log4J
  • Mysql разъем

Ответы [ 3 ]

11 голосов
/ 19 марта 2010

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

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

4 голосов
/ 19 марта 2010

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

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

2 голосов
/ 19 марта 2010

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

Из Javadoc invokeAndWait , InterruptedException выбрасывается

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

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

...