2010-05-13 64 views
9

SwingWorker用於以下目的的區別:爪哇 - SwingWorker類和SwingUtilities.invokeLater()

  • 對於在不同的線程中運行長時間運行的任務,以防止從GUI不響應
  • 對於具有通過在任務通過done()方法結束時的長時間運行的任務產生的結果更新GUI。
  • 對於具有產生並通過用publish()process()方法的幫助下,任務公佈的中間結果不時更新GUI時間。

SwingUtilities.invokeLater()可以如下執行上述任務:

  • 而不是從EDT執行SwingWorker.execute()的方法,我們可以執行ExecutorService.submit(new MyRunnable()),因爲它也將創造另一個線程可以執行長時間運行的任務。
  • 對於在任務結束時更新GUI,我們可以在任務結束時把代碼(寫在情形1的done()方法)SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
  • 爲了在任務中更新GUI,我們可以在case1中的方法publish()方法中放置代碼(寫在case1的process()方法中)SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())

我問這個問題,因爲問題Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT規定的問題可以通過SwingUtilities.invokeLater()來解決,但不能與SwingWorker

+1

我不太清楚 '問題' 是什麼。 – akf 2010-05-13 19:11:09

+0

@akf如果你不確定,那就離開吧。簡單:) – 2010-05-13 19:19:59

+0

您引用的問題可以通過使用SwingWorker解決。在那裏看到我的答案。 – 2010-05-13 19:45:43

回答

6

SwingWorker來解決是一個輔助類 - 這是不是你需要使用它,但使用它比手工完成相同的工作更簡單和更清晰。 (這也使得檢查進度更加容易。)請注意,它增加了第6版 - 在此之前有些人習慣在Swing教程中定義一個簡單的類或做類似你提到的那些步驟。

+0

+1便利,有一個源兼容回港爲Java 5 https://swingworker.dev.java.net/ – trashgod 2010-05-13 21:29:17

1

的1.6+ SwingWorker類的一個重要特徵是doInBackground之間進行()的EDT(事件指派線程),差()。您應該像doWorkInsideEDT()一樣將doInBackground()視爲doWorkOutsideEDT()和done()。運行這個教學示例來看看不同的。

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

輸出:

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here.