如何调查SwingWorker启动延迟?

时间:2016-10-28 09:13:13

标签: java multithreading swing debugging swingworker

考虑以下简单方法,它是使用Swing gui的应用程序的一部分:

public void updateFromGoogle(int action)  {

    startTime =  System.currentTimeMillis();

    model.updateFromGoogle(action);

    System.out.println("Total run time "
    + (System.currentTimeMillis()-startTime));

}

上述方法的运行时间i =始终低于1毫。
如果我向方法添加一个无效的SwingWorker

public void updateFromGoogle(int action)  {


    startTime =  System.currentTimeMillis();

    SwingWorker sw = new SwingWorker<Boolean, Void>(){

        @Override
        protected Boolean doInBackground() throws Exception {
            System.out.println("");
            System.out.println("Swing worker start after "
                    + (System.currentTimeMillis()-startTime));

            return null;
        }

        @Override
        public void done() {

            System.out.println("Swing worker finished after "
                    + (System.currentTimeMillis()-startTime));
        }

    };

    sw.execute();

    model.updateFromGoogle(action);

    System.out.println("Total run time "
    + (System.currentTimeMillis()-startTime));

}


偶尔我可以看到SwingWorker 在很长一段时间后开始,例如(毫秒):

  

摇摆工人在19734年后开始   

     

摇摆工人在19767年之后完成


问题:
1。是否建议偶尔在事件调度线程上运行其他长任务?
2.我如何调查导致它的任务?

编辑:在评论后,我安装了jvisualvm,表明SwingWorker使用了8个线程的池:

enter image description here

1 个答案:

答案 0 :(得分:0)

根据@SergiyMedvynskyy评论我安装了jvisualvm
通过对cpu进行采样,我发现另一个SwingWorker进程正在运行很长时间,显然阻塞了其他进程:

enter image description here