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

再論 Java Swing 執行緒模型

     編輯:Java 程式設計入門

不正確的 Swing 執行緒是導致 Swing 應用運行緩慢、無回應與不穩定的主要原因之一。原因多樣:從開發人員對 Swing 單執行緒模型的誤解,到保證正確執行緒執行的困難。即使投入大量精力,應用執行緒邏輯仍難以理解與維護。本文闡述如何在開發 Swing 應用中使用事件驅動程式設計,以大幅簡化開發、維護,並提供高靈活性。

背景

Swing API 圍繞單執行緒模型設計:Swing 組件必須始終透過同一條執行緒修改與操作。採用單執行緒模型的原因包括開發成本與同步 Swing 的複雜性——後者會導致遲鈍的 API。為達此模型,有一條專門執行緒負責與 Swing 組件交互,即眾所周知的 Swing 執行緒、AWT 執行緒(有時發音為 "ought")或事件分派執行緒。本文統稱「Swing 執行緒」。

Swing 執行緒是與 Swing 組件交互的唯一執行緒,肩負重任:所有繪圖、圖形、滑鼠事件、組件事件、按鈕事件等皆發生於此。因工作已非常繁重,若在 Swing 執行緒處理過多非 Swing 任務(如事件監聽器中的資料庫查詢),會佔用 Swing 工作,阻止其處理繪圖、滑鼠移動、按鈕事件、視窗縮放等任務。用戶以為應用死機,實際上並非如此。在適當執行緒執行代碼對確保系統正常運行至關重要。

通用 Swing 執行緒解決方案

以最常見的 Swing 執行緒錯誤為例:在按鈕的 ActionListener 中直接調用耗時的 lookup() 方法。下列代碼演示此錯誤(以 Thread.sleep(5000) 模擬 5 秒同步伺服器呼叫):

private void searchButton_actionPerformed() {
    outputTA.setText("Searching for: " + searchTF.getText());
    // Broken!! Too much work in the Swing thread
    String[] results = lookup(searchTF.getText());
    outputTA.setText("");
    for (int i = 0; i < results.length; i++) {
        String result = results[i];
        outputTA.setText(outputTA.getText() + "\n" + result);
    }
}

運行後發現:Go 按鈕呈現按下狀態未彈回,查詢字串未顯示在文字區域。原因在於 setText 的重繪請求被放入 Swing 事件佇列等待處理,但 Swing 執行緒被查詢佔用,無法及時重繪。基本查詢用戶界面
圖 1. 基本查詢用戶界面

在 Swing 執行緒中進行查找
圖 2. 在 Swing 執行緒中進行查找

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 4
  • 下一頁
  • 尾頁
  • 共4頁
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved