我想衡量一下事件调度线程的“繁忙程度”。一个可能的想法是设置一个后台线程,它执行以下操作:
while(true) {
final long[] end = new long[1]; // Array to get stuff out from Runnable.
long start = System.nanoTime();
EventQueue.invokeAndWait(new Runnable() {
public void run() {
end[0] = System.nanoTime();
}
});
long queueTimeNs = end[0] - start;
// Report the queue time somewhere.
Thread.sleep(100); // Poll the EDT < 10 times/s.
}
我们的想法是衡量从发送事件到EDT到发送事件所需的时间。这将大致了解UI的响应性。
这有什么意义吗?是否有更标准的方法来做类似的事情?
答案 0 :(得分:2)
我使用了一个很好的工具:SwingExplorer。它允许您检查Swing组件,查看它们的绘制方式,检测EDT违规以及检测EDT的挂起。基本上,您输入一个持续时间值(以毫秒为单位),然后您可以使用您的应用程序。当EDT挂起超过此持续时间时,挂起将记录在工具的UI中。
官方网站是https://swingexplorer.dev.java.net,但在我写这个答案时,它似乎已经失效了。您可以找到Eclipse和NetBeans的插件,如果您使用maven,也可以在maven存储库中找到swingexplorer(抱歉,我暂时找不到链接)
至少存储库仍然可用:cvs -d :pserver:guest:guest@cvs.dev.java.net:/shared/data/ccvs/repository co swingexplorer
我查看了Swing资源管理器的源代码,看起来他们编写了一个自定义EventQueue
来检查EDT行为。代码似乎与另一个项目SwingHelper相关。
该项目的网站很快将在http://java.net/projects/swingexplorer
回来答案 1 :(得分:1)
我认为你的appraoch在测量“响应性”方面接近理想,因为它考虑了EDT中完成的实际工作量(在设计糟糕的应用程序中可能太多)和机器执行该操作的能力工作
顺便说一下,我曾尝试更换/重新路由EDT,但经过几个小时后,我发现即使在鲁莽地使用反射访问实现类的私有字段时也是不可能的。最后,一切都取决于等待的本地物体,这是不可能的。我怀疑由于同样的原因,我不可能拦截EDT来获取诸如处理事件数量之类的信息(这是我对你可以使用的指标的第一个想法)。