首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Swing併發編程:SwingWorker線程模式詳解

     編輯:Java 相關知識

本文翻譯自Java SE 6官方教程《Concurrency in Swing》,系統講解Swing中三類線程(初始線程、事件分發線程、工作線程)協作機制,重點介紹javax.swing.SwingWorker實現耗時任務的最佳實踐。

三類線程角色

  • 初始線程:啟動main或Appletinit,僅負責通過SwingUtilities.invokeLater/InvokeAndWait將GUI構建任務提交給事件分發線程(EDT)。
  • 事件分發線程 (EDT):所有事件處理(ActionListener等)與絕大多數Swing組件交互代碼在此執行。任務必須極快完成,否則界面卡頓。
  • 工作線程:執行耗時操作(IO、計算、查詢),由SwingWorker實例承載,避免阻塞EDT。

SwingWorker 核心特性

  1. doInBackground():工作線程執行核心邏輯,返回結果類型由第一個泛型參數指定。
  2. done():任務完成後自動在EDT調用,可安全更新UI。
  3. 實現Future<V>:提供get()獲取結果、cancel()取消任務、isDone()/isCancelled()狀態查詢。
  4. publish(V...)/process(List<V>):工作線程發布中間結果,EDT批量處理更新UI(如進度條)。
  5. 綁定屬性progress(0-100)與state(PENDING/STARTED/DONE)觸發PropertyChangeEvent,EDT監聽更新狀態組件。

範例解析

簡單後台任務:TumbleItem Applet

圖片加載移至SwingWorker,doInBackground返回ImageIcon[],done()中get()取結果賦值給成員變量,GUI立即顯示無阻塞。

中間結果報告:Flipper 投擲硬幣

SwingWorker<Void, FlipPair>,doInBackground循環調用publish(new FlipPair(heads,total)),process取最新值更新三個文本框(正面數、總數、偏差)。

任務取消與狀態監聽

cancel(true)發送中斷或設置isCancelled(),任務需定期檢查isCancelled()或響應InterruptedException退出。PropertyChangeListener監聽progress/state驅動進度條與狀態標籤(ProgressBarDemo)。

關鍵API速查

  • SwingUtilities.invokeLater(Runnable) / invokeAndWait(Runnable):提交任務到EDT。
  • SwingUtilities.isEventDispatchThread():檢測當前線程是否為EDT。
  • SwingWorker<T,V>:T=最終結果類型,V=中間結果類型。
  • execute():啟動SwingWorker(內部使用線程池)。

附件下載

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved