我有一个正在用Swing构建的应用程序。它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程很顺利,除了有时UI会暂停大约750ms,我不知道为什么。这并不总是发生-但有时在应用程序中发生了一些事情,它开始像这样每6-8秒暂停一次。
似乎很明显,有一些事件被放置在EDT上,大约需要750毫秒才能运行,这不应该发生。
我如何具体地分析EDT?我真正想做的是获得一些东西,每次事件在EDT上运行时都会输出到日志或System.out中,并记录事件所用的总时间。有没有办法做到这一点?
或者有没有什么工具可以帮我做到这一点,并给我一个在EDT上运行的所有东西的日志,以及它需要多长时间?
我想浏览一下这个日志,看看花了很长时间的所有事情,然后找出问题所在。
发布于 2011-04-05 00:56:34
看看这个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());发布于 2011-04-05 00:42:12
确保您在EDT中只运行与GUI相关的操作,并且EDT中没有长时间运行的任务。有一个叫做SwingExplorer的很棒的工具,它有一个特性可以用来监控EDT操作。希望这能有所帮助。
发布于 2011-04-05 00:44:43
我想说,这很可能不是EDT上的东西,而是垃圾收集。
假设是这样的话,恐怕我不知道任何解决方案。实际上,我从来没有在Swing中编写过没有这种行为的东西。
要尝试调试,您可以子类化EventQueue并使用以下命令安装一个新的:
Toolkit.getDefaultToolkit().getSystemEventQueue().push(xxx);
这应该允许您至少看到EDT正在处理哪些事件。
https://stackoverflow.com/questions/5541493
复制相似问题