【问题标题】:Java Swing GUI frozen on refocusJava Swing GUI 在重新聚焦时冻结
【发布时间】:2012-09-20 13:11:33
【问题描述】:

我有一个在 WinXP 上运行的 Swing GUI。

有时,当我做其他事情(在网上冲浪......)然后我想回到我的程序时,GUI 出现但完全冻结,我无法对其执行任何操作。

我必须等待(可能是 10 秒或 5 分钟),直到它再次起作用。

当我从屏幕保护程序回来时,我注意到了同样的问题(所以我禁用了它)。

机器故障,RAM 和处理器级别正常。

您知道这个非常烦人的问题的根源吗?可能是重绘问题?

【问题讨论】:

  • 可能是线程问题 - 您是否在 GUI 线程中运行任何可能需要时间的计算并在您的应用重新获得焦点时冻结 GUI?
  • +1 评论,如果 Swing 绘制线程被冻结,那么某些东西正在使用该线程做不应该做的事情
  • 您的应用程序可能正在工作,并且做了很多工作......它只是不是基于 GUI,所以它看起来很慢/滞后。正如其他人所说,线程可能是减轻一些驴工作的方式。但是,根本没有任何代码很难判断...
  • 我已经分离了定期执行一些操作的线程。除此之外,动作仅由侦听器设置。我从未指定我的应用程序在重新获得焦点时运行某些代码。
  • 下次遇到这种情况时,请进行线程转储(或多个),以便您至少知道应用程序在做什么(尤其是 EDT 在做什么)。例如jstack 允许进行线程转储

标签: java swing concurrency freeze event-dispatching


【解决方案1】:

对此可能有很多解释:

  1. 您的应用在 EDT 线程(控制界面更新的线程)中执行了一些繁重的操作
  2. 可能存在由 L&F 或组件错误导致的 UI 更新问题(极少数情况)
  3. GC 由于一些内部调用而发生并处理整个应用程序(不太可能)
  4. 应用程序窗口的一些本机或旧 JDK 问题(几乎 0% 的可能性是您的情况)

通常第一种解释是有效的,在这种情况下,您应该只检查您的代码并将所有“繁重”操作提取到单独的线程中。

无论如何,如果没有看到代码,我不能说更具体的内容......

【讨论】:

  • 实际上,它发生在我从其他屏幕回来时,它需要再次工作的时间通常取决于我没有专注于我的程序的时间。如果我不专注于我的应用程序,GC 就不起作用?
  • GC 在需要工作时(例如内存达到其限制)或通过 System.gc() 直接调用时工作。无论如何,这只是一个猜测。当您的应用程序获得焦点时,您必须找出确切开始运行的内容(您可以通过分析或调试您的应用程序来做到这一点) - 否则无法帮助您解决问题。不太可能是 Java 问题。
  • 同时查找 empty exception handlersInitial Threads 违规行为。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多