多线程java/swing:gui冻结,没有线程挂起
首先,它是一个巨大的应用程序,问题涉及到很多行,所以我不能真正附加任何代码
在主要包括清除和向某些集合重新添加元素的更改之后,应用程序的swing GUI冻结。在执行添加的代码时,冻结不会发生,但会在一段时间之后发生。奇怪的是没有线程被挂起
我的问题是无限循环是否是这个问题的唯一解释。我觉得这种情况不太可能发生,因为添加的代码完成时没有问题。 可能存在一些不同步的集合访问问题,但我认为不会导致这种情况。看起来我们并不是在处理来自同步问题的死锁,因为没有线程被挂起
# 1 楼答案
你可能已经知道这一点,但为了这个原因,我想说,如果你在应用程序中的长时间运行过程中没有使用Swing worker,那么使用它将是一个理想的情况
# 2 楼答案
这可能是因为在swing中执行事件的事件调度程序线程中等待(由于一些繁重的处理)。理想情况下,您应该在单独的线程中执行任何资源密集型任务,这样UI就不会冻结
# 3 楼答案
最后,这是一个僵局
我的团队负责人告诉我,在eclipse中,等待监视器的线程(在“已同步”状态下)不会显示为挂起。他找到两条线索,要求暂停。然后我看到他们在等待对方释放被占用的监视器
死锁不是我输入的代码的错。只是我所做的改变暴露了在其他地方的错误同步
谢谢大家帮我,我真的很感激。这是我关于stackoverflow的第一个问题,我很惊讶你的反应如此之快
# 4 楼答案
庞大的应用程序+操作集合->;垃圾收集器开始工作了
以下是SO的一些相关阅读: side effect for increasing maxpermsize and max heap size
和Oracle关于GC调优的文章: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html