本文翻譯自Java SE 6官方教程《Concurrency in Swing》,系統講解Swing中三類線程(初始線程、事件分發線程、工作線程)協作機制,重點介紹javax.swing.SwingWorker實現耗時任務的最佳實踐。
main或Appletinit,僅負責通過SwingUtilities.invokeLater/InvokeAndWait將GUI構建任務提交給事件分發線程(EDT)。ActionListener等)與絕大多數Swing組件交互代碼在此執行。任務必須極快完成,否則界面卡頓。SwingWorker實例承載,避免阻塞EDT。doInBackground():工作線程執行核心邏輯,返回結果類型由第一個泛型參數指定。done():任務完成後自動在EDT調用,可安全更新UI。Future<V>:提供get()獲取結果、cancel()取消任務、isDone()/isCancelled()狀態查詢。publish(V...)/process(List<V>):工作線程發布中間結果,EDT批量處理更新UI(如進度條)。progress(0-100)與state(PENDING/STARTED/DONE)觸發PropertyChangeEvent,EDT監聽更新狀態組件。圖片加載移至SwingWorker,doInBackground返回ImageIcon[],done()中get()取結果賦值給成員變量,GUI立即顯示無阻塞。
SwingWorker<Void, FlipPair>,doInBackground循環調用publish(new FlipPair(heads,total)),process取最新值更新三個文本框(正面數、總數、偏差)。
cancel(true)發送中斷或設置isCancelled(),任務需定期檢查isCancelled()或響應InterruptedException退出。PropertyChangeListener監聽progress/state驅動進度條與狀態標籤(ProgressBarDemo)。
SwingUtilities.invokeLater(Runnable) / invokeAndWait(Runnable):提交任務到EDT。SwingUtilities.isEventDispatchThread():檢測當前線程是否為EDT。SwingWorker<T,V>:T=最終結果類型,V=中間結果類型。execute():啟動SwingWorker(內部使用線程池)。