有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程java GUI在几秒钟内没有响应

我们有一个java客户机/服务器应用程序,其中GUI通常(每半小时一次)会在平均2到10秒钟内失去响应。点击不同的按钮只会在挂起几秒钟后生效

我起初以为是GC问题,但调查证明这方面没有问题

我更确信这是一个线程问题,图形线程有时会阻塞

如何检查图形线程的状态,以在日志中看到其“无响应”?我想我可以每隔一秒左右从另一个线程检查它的状态,但如何做到这一点呢?要调查哪个变量

关于如何解决这个问题还有其他想法吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    要了解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");
           }
       });
    

    }

  2. # 2 楼答案

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

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

    最糟糕的情况是,您可以使用JMX编写自己的代码,按照此链接的思路执行某些操作。过去它对我很有用

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

  3. # 3 楼答案

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