谁打断了我的话题?

Posted

技术标签:

【中文标题】谁打断了我的话题?【英文标题】:Who interrupts my thread? 【发布时间】:2011-01-29 09:06:58 【问题描述】:

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

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

有什么方法可以告诉你吗? InterruptedException 不包含请求中断的线程名称是否有原因?

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

休眠 春天 Lo​​g4J mysql 连接器

【问题讨论】:

我想你的意思是“谁 DARES 打断了我的话题?” +1 - 你在做 Thread#join 吗?它抛出 InterruptedException。 确实,Scott,我希望我的线程不能被中断(因为无论如何我都不想遵守请求)。我们自己不做 Thread#join,但我可以想象 invokeAndWait 使用这样的机制。但是,Thead#join 会在另一个线程上调用中断吗?另外我很确定没有人等待我的线程完成(因为它永远不会)。 Thread.dumpStacktrace() 没有帮助??? 当前线程不是执行中断的线程,所以 dumpStackTrace 不应该给我我需要的信息。异常的堆栈跟踪显示它发生在 Object.wait() 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

一般来说,如果您想知道谁在做某事,请附加一个调试器,设置一个断点,然后就可以了。能不能复现就不用猜了!

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

【讨论】:

【参考方案3】:

这里有些奇怪。

从invokeAndWait 的javadoc 中,抛出InterruptedException

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

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

【讨论】:

如果我们等待的 Runnable 抛出异常,它应该给出 InvocationTargetException,但事实并非如此。有可能我们的线程在等待时有锁,这会导致它吗?我敢肯定我们没有陷入僵局。我们等待的线程会创建一个我们在等待线程中使用的对话框。

以上是关于谁打断了我的话题?的主要内容,如果未能解决你的问题,请参考以下文章

找出谁使用 OAuth 重定向 uri 邀请了我的机器人服务器

ActionScript 3 AS3谁调用了我的动作脚本方法?

AS3谁调用了我的actionscript方法?

Linux中是谁占用了我的端口

容器化之路:谁偷走了我的构建时间

BigQuery 查询的费用由谁支付?