java GUI几秒钟没有响应

时间:2011-04-26 01:26:53

标签: java multithreading user-interface thread-safety

我们有一个java客户端/服务器应用程序,其GUI定期(每半小时)平均2到10秒无响应。点击不同的按钮只会在几秒钟的挂起时间后生效。

我首先想到有一个GC问题,但调查证明这方面没有错。

我更确信这是一个线程问题,图形线程在某些时刻会被阻塞。

如何检查图形线程的状态,以便在我的日志中看到它“无响应”?我想我可以从一个不同的线程每隔一秒左右检查它的状态,但是怎么做呢?要轮询哪个变量?

关于如何解决这个问题的任何其他想法?

感谢

3 个答案:

答案 0 :(得分:5)

您可以向Java进程发出kill -QUIT(以及Windows上的等效内容),这将导致所有线程将其堆栈跟踪转储到STDOUT,这样您就可以看到发生了什么。这也显示了哪些线程持有锁(同步块)以及哪些线程正在等待。

答案 1 :(得分:2)

如果您无法在测试中重现问题,并且无法关闭生产,那么您的问题就没有简单的答案。

看起来您可能有更大的问题需要使用某种分析工具来诊断。我们使用JProbe& JProfiler并且有很多运气。

最糟糕的情况是,您可以使用JMX来编写自己的代码,这些代码可以执行此链接。这对我来说非常有用。

http://www.javamex.com/tutorials/profiling/profiling_java5_threads_methodology.shtml

答案 2 :(得分:2)

要了解ui线程被阻止多长时间,您可以执行类似的操作,

ScheduledThreadPoolExecutor executor = ....
executor.scheduleAtFixedRate(new Runnable(){ 
   public void run() {testEventThread();}}, 5, 5, TimeUnit.SECONDS);

void testEventThread() {
   final long now = System.currentTimeMillis();
   SwingUtilities.invokeLater(new Runnable() {
       public void run() {
             System.out.println("event thread took:" + (System.currentTimeMillis()- now) + " to respond");
       }
   });

}