首頁 > Java > java教程 > 主體

如何在 Java 中的兩個 SwingWorker 類別之間共享資料?

DDD
發布: 2024-11-18 08:44:02
原創
521 人瀏覽過

How to Share Data Between Two SwingWorker Classes in Java?

如何在Java 中的兩個SwingWorker 類之間共享數據

簡介

使用時Java 應用程式中有多個線程,有時需要在它們之間共用資料。 SwingWorker 類別擴展了 SwingUtilities,提供了一種在單獨執行緒中執行耗時任務的便利方法,而不會阻塞主事件調度執行緒。

問題陳述

考慮這樣一個場景,您有兩個 SwingWorker 類別:FileLineCounterThread 和 FileDivisionThread,每個類別負責執行不同的任務。假設您要將結果從 FileLineCounterThread 傳遞到 FileDivisionThread。

解決方案

在SwingWorker 類別之間共享資料涉及兩個步驟:

  1. 從後台到EDT線程通訊:

    • 建立一個PropertyChangeListener並將其加入到SwingWorker中。
    • 在done()中SwingWorker 的方法,使用所需的資料觸發 PropertyChangeEvent。
  2. 監聽 EDT 執行緒中的屬性變更:

    • 建立一個實作 PropertyChangeListener 介面的物件。
    • 向 SwingWorker 註冊此監聽器。
    • 在監聽器的propertyChange() 方法中,擷取並處理從後台執行緒傳遞過來的資料.

範例

範例
import javax.swing.SwingWorker;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class DataSharingSwingWorker {

    public static void main(String[] args) {
        // Create the SwingWorker instances
        SwingWorker<Integer, Void> lineCounterWorker = new LineCounterWorker();
        SwingWorker<String, Void> divisionWorker = new DivisionWorker();

        // Add a listener to the line counter worker
        lineCounterWorker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("result".equals(evt.getPropertyName())) {
                    // Retrieve the line count from the event
                    int lineCount = (int) evt.getNewValue();

                    // Pass the line count to the division worker
                    divisionWorker.passData(lineCount);
                }
            }
        });

        // Execute the workers
        lineCounterWorker.execute();
        divisionWorker.execute();
    }

    private static class LineCounterWorker extends SwingWorker<Integer, Void> {
        @Override
        protected Integer doInBackground() throws Exception {
            // Perform line counting
            return null; // Placeholder for line count
        }

        @Override
        protected void done() {
            firePropertyChange("result", null, get());
        }
    }

    private static class DivisionWorker extends SwingWorker<String, Void> {
        private int lineCount;

        public void passData(int lineCount) {
            this.lineCount = lineCount;
        }

        @Override
        protected String doInBackground() throws Exception {
            // Perform division operation based on the line count
            return null; // Placeholder for division result
        }

        @Override
        protected void done() {
            System.out.println("Division result: " + get());
        }
    }
}
登入後複製
實作

實作以下程式碼片段示範如何實現上述步驟:

結論透過利用PropertyChangeListener機制,SwingWorker交易類別可以有效地在並行執行緒之間共享數據,從而在複雜的多執行緒應用程式中提供更大的靈活性和控制力。

以上是如何在 Java 中的兩個 SwingWorker 類別之間共享資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板