SwingUtilities.invokeLater和SwingWorker之间的区别<void,object =“”>?</void,>

时间:2013-10-18 08:24:34

标签: java multithreading swing 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
        }
    });

    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();

哪种方法更好用?

1 个答案:

答案 0 :(得分:15)

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

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

但SwingWorker的doInBackground()方法也可以通过调用publish()方法发布中间结果。 SwingWorker将确保发布的结果由Event Dispatch Thread处理。您可以通过实施process()方法来实现。