Swing “测量”;“忙碌”;事件调度线程的

Swing “测量”;“忙碌”;事件调度线程的,swing,queue,performance,event-dispatch-thread,Swing,Queue,Performance,Event Dispatch Thread,我想测量一下我的活动调度线程的“繁忙程度”。一个可能的想法是设置一个后台线程,它可以执行以下操作: 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() {

我想测量一下我的活动调度线程的“繁忙程度”。一个可能的想法是设置一个后台线程,它可以执行以下操作:

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.
}
while(true){
final long[]end=new long[1];//从Runnable中取出内容的数组。
长启动=System.nanoTime();
invokeAndWait(new Runnable()){
公开募捐{
end[0]=System.nanoTime();
}
});
long queueTimeNs=结束[0]-开始;
//在某处报告队列时间。
Thread.sleep(100);//轮询EDT<10次/s。
}
其目的是测量从将事件发送到EDT到发送事件所需的时间。这将大致了解UI的响应性


这有什么意义吗?有没有更标准的方法来做类似的事情?

我认为您的方法在衡量“响应性”方面接近理想,因为它考虑了EDT中完成的实际工作量(在设计糟糕的应用程序中可能太多)和机器完成该工作的能力

顺便说一句,我曾经尝试替换/重新路由EDT,但几个小时后,我发现即使不计后果地使用反射来访问实现类的私有字段,这也是不可能的。最后,一切都取决于一个被等待的本地对象,这是不可能得到的


我怀疑出于同样的原因,不可能截获EDT以获取诸如处理的事件数等信息(这是我对您可以使用的度量的第一个想法)。

为此,我使用了一个优秀的工具:SwingExplorer。它允许您检查Swing组件,查看它们是如何绘制的,检测EDT冲突,以及检测EDT挂起。基本上,你输入一个以毫秒为单位的持续时间值,然后玩你的应用程序。当EDT挂起超过此持续时间时,挂起将记录在工具的UI中

官方网站是,但在我写下这个答案的那一刻,它似乎已经关闭了。如果您使用maven,您可以找到Eclipse和NetBeans的插件,也可以在maven存储库中找到swingexplorer(对不起,我暂时找不到链接)

至少存储库仍然可用:
cvs-d:pserver:guest:guest@cvs.dev.java.net:/shared/data/ccvs/repository co swingexplorer

编辑 我查看了Swing explorer的源代码,似乎他们编写了一个定制的
EventQueue
来检查EDT行为。代码似乎与另一个项目有关

编辑2
这个项目的网站很快就会回来的

哇,我从来没有听说过这个工具!我得试试看。