ホームページ >Java >&#&チュートリアル >Java の 2 つの SwingWorker クラス間でデータを共有するにはどうすればよいですか?

Java の 2 つの SwingWorker クラス間でデータを共有するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-18 08:44:02609ブラウズ

How to Share Data Between Two SwingWorker Classes in Java?

Java の 2 つの SwingWorker クラス間でデータを共有する方法

概要

Java アプリケーション内に複数のスレッドがある場合、それらの間でデータを共有することが必要になる場合があります。 SwingUtilities を拡張する SwingWorker クラスは、メイン イベント ディスパッチ スレッドをブロックせずに、時間のかかるタスクを別のスレッドで実行する便利な方法を提供します。

問題ステートメント

それぞれが異なるタスクの実行を担当する 2 つの SwingWorker クラス、FileLineCounterThread と FileDivisionThread があるシナリオを考えてみましょう。 FileLineCounterThread からの結果を FileDivisionThread に渡すとします。

解決策

SwingWorker クラス間でデータを共有するには、次の 2 つの手順が必要です。

  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 の 2 つの SwingWorker クラス間でデータを共有するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。