首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 多執行緒傳遞 JTextArea 參考更新 UI 的正確模式

     編輯:程式設計綜合問答

錯誤做法

在接收訊息執行緒直接呼叫 textArea.append(msg) → **違反 Swing 單執行緒規則**,導致 UI 凍結或異常。

正確模式:SwingUtilities.invokeLater

// 接收執行緒
public void run() {
    while (running) {
        String msg = socket.readLine();
        final String finalMsg = msg;
        SwingUtilities.invokeLater(() -> {
            textArea.append(finalMsg + "\n");
            textArea.setCaretPosition(textArea.getDocument().getLength());
        });
    }
}

替代方案

  • 使用 SwingWorker 封裝背景任務,process() / done() 自動在 EDT 執行。
  • 採用 **觀察者模式**:接收執行緒只負責放入 BlockingQueue,UI 執行緒定時輪詢或由 DocumentListener 觸發更新。

核心原則

**所有 Swing 元件操作必須在 Event Dispatch Thread (EDT) 執行**,背景執行緒僅負責資料準備,透過 invokeLater 或 SwingWorker 安全轉派。

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