2011-06-15 51 views
4

我在桌面擺動應用程序中使用代碼波紋管,並且我沒有太多專業知識 與線程,因爲我是一個休閒的web程序員和交易與鞦韆不是我的糖果...Java Swing中的線程,應用程序中的三種方法的概述

我想知道是否有更好的方法來控制我的3個任務,我需要在我的應用程序線程並行運行它們。

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      task 1     
     } 
    }); 


    Runnable r; 
    r = new Runnable() { 

     public void run() { 
      task 2     
     } 
    }; 
    EventQueue.invokeLater(r); 


    Thread worker = new Thread() { 

     public void run() { 
      task 3     
     } 
    }; 

    worker.start(); 

謝謝!

回答

6

你想做什麼?你的線程在Swing GUI中操作還是獨立於GUI?

如果線程正在使用Swing用戶界面進行操作,則應該使用invokeLater(),因爲這隻能從the Event Dispatch Thread完成。 Swing是單線程的。 (您的任務1和2)

如果您在背景中完全做了某些事情,例如編寫一個大的XML文件,可以在後臺完成thread。 (您的任務3)但是您仍然可以使用invokeLater()與Swing GUI進行通信。

另一種選擇是,如果你想定期運行一個線程,例如每5分鐘,您可以使用一個TimerTask。或者,如果它獨立於Swing GUI java.util.TimerTask

Concurrency in Swing可能是值得一讀:

有以下幾種螺紋

搖擺程序員優惠:

  • 初始線程,即執行初始應用程序代碼的線程。
  • 事件調度線程,其中執行所有事件處理代碼。與Swing框架交互的大多數代碼也必須在此線程上執行。
  • 工作線程,也被稱爲後臺線程,其中執行耗時的後臺任務。
+0

+1爲一個詳細的答案和有用的鏈接。 – MByD 2011-06-15 20:45:33

7

#1和#2是相同的。您應該使用編號#1,因爲這是API的衆所周知的部分。

無論您是使用1號或3取決於以下幾點:

難道是在更改用戶界面或者其支持模式? 如果是,請使用#1。

它是一個長期運行的任務: 如果是,請使用#3。

如果它是一個長期運行的任務,最終將修改用戶界面或其支持模型,請在單獨的線程中執行長時間運行的任務,然後調用incokeLater更新用戶界面。

此外,不是每次創建一個新線程,而是使用一個ExecutorService,以便可以重用線程。

它可能會更復雜一點,例如,如果您當前處於事件線程中(即:在ActionListener.actionPerformed()中,那麼您不需要(不應該)調用invokeLater,但它的要點是在那裏。

+0

+1非常好的答案。清晰和正確的IMO。 – MByD 2011-06-15 20:43:03

+0

同意除了「as in should not」之外的所有事情都會在監聽器中調用invokeLater (通常)保證在EDT上運行的回調函數:這樣做會調用任務_after_所有待處理事件完成後,因此它會影響順序執行的任務 – kleopatra 2011-06-16 15:07:18

+2

如果您正在執行一個長時間運行的任務,最終將修改用戶界面,那麼SwingWorker是比cre更好的選擇在自己的線程或直接使用執行程序服務。 – 2011-06-16 19:09:51