java线程或swingWorker和gui的好习惯

时间:2017-09-24 10:21:53

标签: java multithreading user-interface

我有一个小问题,我想在一个线程中做一些事情,然后在它完成后打开一个新的GUI窗口。我找到了几个解决方案:

  1. 是创建一个线程并在线程内部完成我的工作并在更新我的GUI之后排队,对我来说这种方式感觉不好,因为我觉得通过一个没有的线程来更新我的GUI用于更新GUI并不是最好的主意。

    new Thread(() -> {
        doSomethingsHere()
        updateGui();
    }).start();
    
  2. 使用完全为此构建的SwingWorker,但需要很多行,并且这样做几次可能会使我的代码有点混乱。

    public void doThingsInBackground() {
        SwingWorker<Void,Void> SwingWorker = new SwingWorker<Void, Void>(){
            protected Void doInBackground(){
                doSomethingsHere()
                return (Void) new Object();
            }
    
            protected void done(){
                updateGui();
            }
        };
        SwingWorker.execute();
    }
    
  3. 使用一个线程和一个监听器,就像一个自定义事件,当线程结束事件运行时,由于某种原因,这对我来说是最好的。

  4. 我的问题是,这是最好的&#34;好的做法&#34;?

1 个答案:

答案 0 :(得分:0)

SwingUtilities.invokeLater(Runnable);SwingWorker是可行的方法。从Thread更新UI将无效,因为需要在EDT(事件调度线程) - 主线程中处理UI事件。

SwingUtilities.invokeLater(Runnable);可以运行到EDT进行处理。 process(List)被调用时,SwingWorker也在这样做。