SwingUtilities.invokeLater和SwingWorker <Void,Object>之间的区别?

Ern*_*dis 3 java swing multithreading swingworker invokelater

有什么区别:

    //Some code, takes a bit of time to process
    (new SomeJFrame()).setVisible(true);

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            (new SomeJWindow()).start();//Start a new thread
        }
    });
Run Code Online (Sandbox Code Playgroud)

和:

    class doGraphics extends SwingWorker<Void, Object> {

        @Override
        public Void doInBackground() {

           //Some code, takes a bit of time to process
            (new SomeJFrame()).setVisible(true);

            return null;
        }

        @Override
        protected void done() {

            (new SomeJWindow()).start();//Start a new thread

        }
    }
    (new doGraphics()).execute();
Run Code Online (Sandbox Code Playgroud)

哪种方法更好用?

Ren*_*ink 15

SwingUtilities.invokeLater 获取Runnable并稍后在ui线程中调用它.通常用于短期运行ui的相关工作.

SwingWorker 在非ui线程中运行主要工作 - 工作线程.在长时间运行的工作完成后done(),在ui线程(事件调度线程)中调用该方法.

但SwingWorker的doInBackground()方法也可以通过调用publish()方法发布中间结果.该SwingWorker会比确保结果发布在事件指派线程进行处理.您可以通过实现该process()方法来实现.