【问题标题】: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()

标签: java multithreading swing interrupted-exception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这里有些奇怪。

      invokeAndWait 的javadoc 中,抛出InterruptedException

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

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

      【讨论】:

      • 如果我们等待的 Runnable 抛出异常,它应该给出 InvocationTargetException,但事实并非如此。有可能我们的线程在等待时有锁,这会导致它吗?我敢肯定我们没有陷入僵局。我们等待的线程会创建一个我们在等待线程中使用的对话框。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多