如何在Swing中分析EDT?

时间:2011-04-04 16:33:09

标签: java swing profiling event-dispatch-thread

我有一个应用程序,我正在Swing中构建。它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程是顺利的,除了有时UI将暂停约750毫秒,我不知道为什么。这并不总是会发生 - 但有时会在应用程序中发生某些事情,并且每隔6-8秒开始暂停一次。

似乎很清楚,EDT上有一些事件正在运行750毫秒左右,这应该不会发生。

我如何特别对此EDT进行分析?我真正想要做的是每当事件在EDT上运行时,将事件所花费的总时间量输出到日志或System.out。有没有办法做到这一点?

或者是否有一些工具可以为我做这个并给我一个在EDT上运行的所有东西的日志以及需要多长时间?

我想查看这个日志,查看花费很长时间的所有内容,然后找出问题。

3 个答案:

答案 0 :(得分:9)

看看这个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 :(得分:0)

确保您在EDT中仅运行与GUI相关的操作,并且在EDT中没有长时间运行的任务。有一个很棒的工具叫SwingExplorer,它有一个监控EDT操作的功能。希望这会有所帮助。

答案 2 :(得分:0)

我认为这可能不是EDT上的实际内容,而是垃圾收集。

假设是这种情况我不知道任何解决方案我害怕。我实际上从未在Swing中写过任何偶尔没有这种行为的东西。

尝试&调试你可以继承EventQueue&使用以下方法安装新的

Toolkit.getDefaultToolkit()getSystemEventQueue()推(XXX);

这应该可以让您至少看到EDT正在处理哪些事件。