谁打断了我的话题?
Posted
技术标签:
【中文标题】谁打断了我的话题?【英文标题】:Who interrupts my thread? 【发布时间】:2011-01-29 09:06:58 【问题描述】:我了解 InterruptedException 的作用以及引发它的原因。但是,在我的应用程序中,当我在仅由我的应用程序知道的线程上等待 SwingUtilities.invokeAndWait()
时得到它,并且我的应用程序从不在任何线程上调用 Thread.interrupt()
,它也从不将线程的引用传递给任何人。
所以我的问题是:谁打断了我的线程?
有什么方法可以告诉你吗? InterruptedException 不包含请求中断的线程名称是否有原因?
我读到它可能是执行此操作的框架或库,我们使用以下内容,但我想不出他们中断我的线程的原因:
休眠 春天 Log4J 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 邀请了我的机器人服务器