如何在Swing中分析EDT?

Eri*_*son 4 java swing profiling event-dispatch-thread

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

很明显,EDT上有一些事件正在运行750毫秒左右,这应该不会发生.

我如何具体地描述EDT?我真正想要做的是每当事件在EDT上运行时,将事件所花费的总时间量输出到日志或System.out.有没有办法做到这一点?

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

我想通过这个日志,查看花费很长时间的所有内容,并找到问题所在.

ran*_*ath 9

看看这个问题.它描述了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用自定义类替换默认的EventQueue:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TimedEventQueue());
Run Code Online (Sandbox Code Playgroud)