14

我了解 InterruptedException 的作用以及抛出它的原因。但是,在我的应用程序中,我在等待SwingUtilities.invokeAndWait()仅由我的应用程序知道的线程时得到它,并且我的应用程序从不调用Thread.interrupt()任何线程,它也从不将线程的引用传递给任何人。

所以我的问题是:谁打断了我的线程?

有没有办法告诉?InterruptedException 不包含请求中断的线程的名称是否有原因?

我读到它可能是执行此操作的框架或库,我们使用以下内容,但我想不出他们中断我的线程的原因:

  • 休眠
  • 春天
  • 日志4J
  • Mysql 连接器
4

3 回答 3

12

如果可能,您可以扩展Thread和覆盖interrupt()此线程的方法以打印堆栈跟踪或抛出不受支持的操作异常。

您还可以使用扩展Thread类来存储对中断线程的引用,并在捕获中断的异常后读取它。

于 2010-03-19T12:16:51.240 回答
4

一般来说,如果您想知道谁在做某事,请附加一个调试器,放置一个断点,然后就可以了。无需猜测您是否可以复制它!

在这种情况下,您可以在Thread.interrupt(). 如果还有其他线程也被中断(因此您在断点上有“误报”命中),您可以添加断点条件(大多数 IDE 允许您轻松地做到这一点),例如通过检查线程的名称.

于 2010-03-19T09:47:42.473 回答
2

这里有些奇怪。

invokeAndWaitInterruptedException的 javadoc 中,抛出an

如果我们在等待事件调度线程完成执行 doRun.run() 时被打断

您是否尝试查看在 EDT 中执行的代码是否发送任何异常?或者 EDT 中的代码尝试修改这个线程的一些变量(我知道这个术语在 java 语言中不是“正统的”,但我希望你明白我的意思:任何暗示同步、等待、加入的代码......

于 2010-03-19T09:14:47.720 回答