【问题标题】:Difference between SwingUtilities.invokeLater and SwingWorker<Void, Object>?SwingUtilities.invokeLater 和 SwingWorker<Void, Object> 之间的区别?
【发布时间】:2013-10-27 00:24:19
【问题描述】:

有什么区别:

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

哪种方法更好用?

【问题讨论】:

标签: java multithreading swing swingworker invokelater


【解决方案1】:

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

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

但是 SwingWorker 的doInBackground() 方法也可以通过调用publish() 方法发布中间结果。 SwingWorker 将确保要发布的结果由事件调度线程处理。您可以通过实现process() 方法来挂钩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2014-05-06
    • 1970-01-01
    • 2015-09-26
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多