谁打断了我的线程?

14

我理解InterruptedException的作用以及抛出它的原因。但是在我的应用程序中,当等待一个只被我的应用程序知道的线程上的SwingUtilities.invokeAndWait()时,我会收到此异常,并且我的应用程序从未在任何线程上调用Thread.interrupt(),也从未将线程的引用传递给任何人。

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

有没有办法知道?为什么InterruptedException没有包含请求中断的线程名称?

我读到可能是一个框架或库这样做的,我们使用以下内容,但我想不出他们打断我的线程的理由:

  • Hibernate
  • Spring
  • Log4J
  • Mysql连接器

11
我认为你的意思是“谁敢打断我的话题?” - Scott Smith
2
+1 - 你在使用Thread#join吗?它会抛出InterruptedException异常。 - RubyDubee
确实,Scott,我希望我的线程不会被中断(因为我无论如何都不想遵守请求)。 我们自己不使用Thread#join,但我可以想象invokeAndWait使用了这样的机制。然而,Thead#join会在另一个线程上调用中断吗?此外,我很确定没有人等待我的线程完成(因为它永远不会完成)。 - Thirler
Thread.dumpStacktrace()没有帮助吗? - Santhosh Kumar Tekuri
当前线程不是执行中断的线程,因此dumpStackTrace不应该提供我所需的信息。异常的堆栈跟踪显示它发生在Object.wait()中。 - Thirler
3个回答

12
如果可能的话,您可以扩展Thread并覆盖此线程的interrupt()方法以打印堆栈跟踪或引发不支持的操作异常。
您还可以使用扩展的Thread类来存储对中断线程的引用,并在捕获中断异常后读取它。

5

一般来说,如果你想知道谁在做某件事情,可以附加调试器,设置断点,然后就可以了。如果你能够重现问题,就不需要猜测了!

在这种情况下,你可以在Thread.interrupt()处设置断点。如果还有其他被中断的线程(因此你会有“误报”断点命中),你可以添加断点条件(大多数IDE都可以轻松地完成),例如通过检查线程的名称。


2

这里有一些奇怪的东西。

invokeAndWait的javadoc中可以看到,如果我们在等待事件分派线程执行doRun.run()时被中断,会抛出InterruptedException异常。

你是否尝试查看在EDT中执行的代码是否发送了任何异常?还是EDT中的代码尝试修改此线程的某些变量(我知道这个术语在Java语言中不是“正统”的,但我希望你能明白我的意思:任何涉及同步、等待、加入等的代码)?


如果我们等待的Runnable抛出异常,它应该给出一个InvocationTargetException,但事实并非如此。我们的线程在等待时可能有锁定,这可能是原因吗?我确定我们没有死锁。我们等待的线程创建了一个对话框,我们在等待线程中使用它。 - Thirler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接