【问题标题】:java/swing: gui froze, no thread suspendedjava/swing: gui 冻结,没有线程挂起
【发布时间】:2012-12-04 10:27:52
【问题描述】:

首先它是一个巨大的应用程序,问题涉及很多行,所以我无法真正附加任何代码。

在主要包括清除和重新添加元素到某个集合的更改后,应用程序的摆动 GUI 冻结。在执行添加的代码时不会发生冻结,但会在一段时间后发生。奇怪的是没有线程被挂起。

我的问题是无限循环是否是这个问题的唯一解释。我觉得不太可能是这种情况,因为添加的代码完成后没有问题。 可能存在一些不同步的集合访问问题,但我不认为它会导致这种情况。由于没有挂起线程,因此我们似乎也没有处理来自同步问题的死锁。

【问题讨论】:

  • 您是否尝试过使用调试器?如果 GUI 冻结,您应该在 Event Dispatching Thread 中看到一些东西(在 Eclipse 中,您可以随时暂停任何线程并查看它当前的位置)。另一种选择是使用 JConsole 并查看线程及其当前堆栈调用。
  • GUI freeze ... 进行线程转储,看看是什么阻塞了 AWT 线程
  • 纪尧姆和罗宾这些都是很好的建议。谢谢。

标签: java multithreading swing user-interface freeze


【解决方案1】:

最后是僵局

我的团队负责人告诉我,等待监视器(“同步”)的线程在 Eclipse 中没有显示为挂起。他找到了两个线程并要求暂停它们。然后我看到他们正在等待对方释放被占用的监视器。

死锁不是我输入的代码的错。只是我所做的更改在其他地方显示了错误的同步。

感谢大家的帮助,我真的很感激。这是我关于 stackoverflow 的第一个问题,我很惊讶您的反应速度有多快。

【讨论】:

    【解决方案2】:

    庞大的应用程序 + 操作收集 -> 垃圾收集器开始了?

    在 SO 上的一些相关阅读: side effect for increasing maxpermsize and max heap size

    还有关于 GC 调优的 Oracle 文章: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

    【讨论】:

      【解决方案3】:

      这可能是因为在执行事件的 Swing 中的 Event Dispatcher 线程中等待(由于一些繁重的处理)。理想情况下,您应该在单独的线程中执行任何资源密集型任务,以免 UI 冻结

      【讨论】:

        【解决方案4】:

        您可能已经知道这一点,但为了它,我想说的是,如果您没有在应用程序中长时间运行的进程中使用 Swing 工作者,那么这将是使用它的理想情况。

        【讨论】:

        • 这个GUI实现是基于监听器的,也使用了swing worker。我添加的代码立即完成。
        猜你喜欢
        • 2012-06-26
        • 2012-09-25
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 2013-11-05
        相关资源
        最近更新 更多