java/swing:gui冻结,没有线程挂起

java/swing:gui冻结,没有线程挂起,java,multithreading,swing,user-interface,freeze,Java,Multithreading,Swing,User Interface,Freeze,首先,它是一个巨大的应用程序,问题涉及到很多行,所以我不能真正附加任何代码 在主要包括清除和向某些集合重新添加元素的更改之后,应用程序的swing GUI冻结。在执行添加的代码时,冻结不会发生,但会在一段时间之后发生。奇怪的是没有线程被挂起 我的问题是无限循环是否是这个问题的唯一解释。我觉得这种情况不太可能发生,因为添加的代码完成时没有问题。 可能存在一些不同步的集合访问问题,但我认为不会导致这种情况。由于没有线程被挂起,看起来我们也没有处理来自同步问题的死锁。大型应用程序+操作集合->垃圾收集

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

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

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

大型应用程序+操作集合->垃圾收集器开始工作了

以下是SO的一些相关阅读:

和Oracle关于GC调优的文章:
这可能是因为在swing中执行事件的事件调度程序线程中等待(由于一些繁重的处理)。理想情况下,您应该在一个单独的线程中执行任何资源密集型任务,以便UI不会冻结

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

最后它是一个死锁

我的团队负责人告诉我,在eclipse中,等待监视器(在“已同步”状态下)的线程不会显示为挂起。他找到两条线索,要求暂停。然后我看到他们在等待对方释放被占用的监视器

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


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

您尝试过使用调试器吗?如果GUI冻结,您应该在事件调度线程中看到一些东西(在Eclipse中,您可以动态暂停任何线程,并查看它当前所在的位置)。另一个选项是使用JConsole并查看线程及其当前堆栈call.GUI冻结。。。进行一次线程转储,看看是什么阻塞了AWT线程Guillaume和Robin,这些都是很好的提示。谢谢。这个GUI实现基于监听器,也使用swing worker。我添加的代码立即完成。