如何在 Swing 中分析 EDT?
Posted
技术标签:
【中文标题】如何在 Swing 中分析 EDT?【英文标题】:How do I profile the EDT in Swing? 【发布时间】:2011-04-04 16:33:08 【问题描述】:我有一个正在 Swing 中构建的应用程序。它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程都很流畅,只是有时 UI 会暂停大约 750 毫秒,我不知道为什么。这并不总是发生 - 但有时应用程序中会发生一些事情,并且它每 6-8 秒开始像这样暂停一次。
似乎很清楚,在 EDT 上放置了一些需要 750 毫秒左右才能运行的事件,这不应该发生。
我如何像这样专门分析 EDT?我真正想做的是每次事件在 EDT 上运行时都会输出到日志或 System.out 以及事件所花费的总时间。有没有办法做到这一点?
或者是否有一些工具可以帮我完成这项工作,并给我记录在 EDT 上运行的所有内容以及需要多长时间?
我想通过这个日志,查看所有需要很长时间的内容,然后找到问题。
【问题讨论】:
获得下面的代码后,我所要做的就是等待问题再次发生。结果我有一个无限循环,其中 EDT 上的一个方法只是在 EDT 上放置另一个方法,依此类推。代码指出了我正确的问题,现在它已经修复了。如果没有这个,可能永远不会找到它。谢谢! 【参考方案1】:看看这个question。它描述了 EDT 上的简单日志。
像这样创建一个类:
public class TimedEventQueue extends EventQueue
@Override
protected void dispatchEvent(AWTEvent event)
long startNano = System.nanoTime();
super.dispatchEvent(event);
long endNano = System.nanoTime();
if (endNano - startNano > 50000000)
System.out.println(((endNano - startNano) / 1000000)+"ms: "+event);
然后用自定义类替换默认的EventQueue:
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TimedEventQueue());
【讨论】:
+1 太棒了。我粘贴了我最终使用的代码。短小精悍,报告所有需要超过 50 毫秒才能完成的事件。【参考方案2】:确保您在 EDT 中仅运行与 GUI 相关的操作,并且 EDT 中没有长时间运行的任务。有一个很棒的工具叫做SwingExplorer 它有一个功能可以监控 EDT 操作。希望这会有所帮助。
【讨论】:
是的,我了解如何使用 EDT。这就是我寻找这个工具的原因。【参考方案3】:我想说这可能实际上不是 EDT 上的东西,而是垃圾收集。
假设是这种情况,恐怕我不知道任何解决方案。实际上,我从来没有在 Swing 中写过任何偶尔没有这种行为的东西。
要尝试和调试,您可以继承 EventQueue 并使用以下方法安装一个新的:
Toolkit.getDefaultToolkit().getSystemEventQueue().push(xxx);
这至少可以让您看到 EDT 正在处理哪些事件。
【讨论】:
以上是关于如何在 Swing 中分析 EDT?的主要内容,如果未能解决你的问题,请参考以下文章