2010-12-23 82 views

回答

11

線程和Runnable是Java 1.0的一部分;他們和當時一樣好。

自那時起,新的併發類提取了所有關於多線程的知識(謝謝Doug Lea等人)。編寫多線程代碼非常困難。新的併發類,包括SwingWorker,試圖讓這更容易。

首先注意泛型爲強類型。內置了一個機制來發布和處理最終和中間結果。

可以用Thread和Runnable模仿這些,但SwingWorker已經爲你做了。

+1

SwingWorker真的是新併發類的一部分嗎?我認爲它是Swing API的一部分,使用它的主要原因是因爲有關事件調度​​線程(EDT)的限制。 – 2010-12-23 12:44:10

12

SwingWorker負責處理一些細節,例如運行任務時的UI更新或任務完成後。這些必須在Swing EDT線程上執行。你可以自己做,但是做錯了很容易。

14

我覺得SwingWorker的文檔是相當不錯的:

的抽象類在專用 線程中執行冗長 GUI的交互任務。

在編寫多線程使用的Swing 應用,有兩個 約束要記住:(參見 How to Use Threads有詳細介紹):

  • 耗時的任務,不應該運行事件調度線程。 否則應用程序變爲 無響應。
  • 只能在事件調度線程 上訪問Swing組件。

這些限制意味着一個GUI 應用隨時間密集 計算需要至少兩個線程: 1)一個線程來執行冗長 任務和2)在事件指派線程 (EDT)對於所有的GUI相關的活動。 這涉及到線程間 通信,這可能會很棘手的到 實現。

的SwingWorker被設計用於需要有一個長期運行的 任務運行在後臺線程和 提供更新的用戶界面既可以當 完成,或在處理情況 。 SwingWorker的子類 必須實現 doInBackground()方法來執行 後臺計算。

你一定可以做到這一點使用線程,運行和SwingUtilities類(invokeLater),但它更容易和使用SwingWorker類可能不太容易出錯。

6

SwingWorker封裝與事件派發線程的正確交互。 Runnable沒有。