如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PhantomJS 中分析 javascript

如何在生产环境中分析请求?

如何在 Ruby on Rails 中分析请求?

如何在 Android Studio 中分析测试?

如何在 Python 中分析异常处理?

如何在 MVC 框架中分析 SQL 查询?