使用SwingWorker
而不是Thread
或Runnable
有什麼好處?爲什麼使用SwingWorker?爲什麼不只是線程或可運行?
14
A
回答
11
線程和Runnable是Java 1.0的一部分;他們和當時一樣好。
自那時起,新的併發類提取了所有關於多線程的知識(謝謝Doug Lea等人)。編寫多線程代碼非常困難。新的併發類,包括SwingWorker,試圖讓這更容易。
首先注意泛型爲強類型。內置了一個機制來發布和處理最終和中間結果。
可以用Thread和Runnable模仿這些,但SwingWorker已經爲你做了。
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
沒有。
相關問題
- 1. 爲什麼線程只運行一次?
- 2. 爲什麼我的SwingWorker線程即使執行完畢也能繼續運行?
- 3. 爲什麼OpenMP程序只運行一個線程
- 4. 爲什麼我的GUI在SwingWorker線程運行時沒有響應?
- 5. 爲什麼javascript不運行
- 6. cron爲什麼不運行?
- 7. RxJava - 爲什麼執行者只使用一個線程
- 8. 爲什麼線程不執行IDisposable?
- 9. 爲什麼makecontext不併行線程
- 10. 爲什麼這可不行 - 使用jQuery
- 11. 爲什麼存儲過程不運行?
- 12. JOGL程序爲什麼不運行?
- 13. 線程運行時,BackKey不起作用。爲什麼?
- 14. php - 爲什麼foreach只運行一次?
- 15. 爲什麼NavigationService.Navigate只在最後運行?
- 16. 爲什麼線程不能在java中並行運行?
- 17. 爲什麼SQLiteOpenHelper不是隻調用SQLiteHelper?
- 18. 爲什麼或者爲什麼不在C++中使用memset?
- 19. 爲什麼不運行--exec運行?
- 20. 爲什麼在html中使用id的&class爲什麼不只是一個?
- 21. 爲什麼AsyncTask在應用程序的主線程中運行?
- 22. 爲什麼-2?爲什麼不是-3或-1?
- 23. 爲什麼RxNetty使用線程池?
- 24. 爲什麼在這裏使用線程?
- 25. 爲什麼不運行方法調用?
- 26. 爲什麼在使用多線程時該程序不會運行得更快?
- 27. 爲什麼我的線程不能運行?
- 28. Python 2:線程停止運行,我不知道爲什麼
- 29. 爲什麼我的後臺線程不運行?
- 30. 爲什麼UIWebView的AVPlayerViewController不能在主線程上運行?
SwingWorker真的是新併發類的一部分嗎?我認爲它是Swing API的一部分,使用它的主要原因是因爲有關事件調度線程(EDT)的限制。 – 2010-12-23 12:44:10