Heim >Java >javaLernprogramm >Wie teile ich Daten zwischen zwei SwingWorker-Klassen in Java?

Wie teile ich Daten zwischen zwei SwingWorker-Klassen in Java?

DDD
DDDOriginal
2024-11-18 08:44:02610Durchsuche

How to Share Data Between Two SwingWorker Classes in Java?

So teilen Sie Daten zwischen zwei SwingWorker-Klassen in Java

Einführung

Beim Arbeiten mit Bei mehreren Threads in einer Java-Anwendung ist es manchmal erforderlich, Daten zwischen ihnen auszutauschen. Die SwingWorker-Klasse, die SwingUtilities erweitert, bietet eine bequeme Möglichkeit, zeitaufwändige Aufgaben in einem separaten Thread auszuführen, ohne den Hauptereignis-Dispatch-Thread zu blockieren.

Problemstellung

Stellen Sie sich ein Szenario vor, in dem Sie über zwei SwingWorker-Klassen verfügen, FileLineCounterThread und FileDivisionThread, die jeweils für die Ausführung unterschiedlicher Aufgaben verantwortlich sind. Angenommen, Sie möchten das Ergebnis vom FileLineCounterThread an den FileDivisionThread übergeben.

Lösung

Das Teilen von Daten zwischen SwingWorker-Klassen umfasst zwei Schritte:

  1. Kommunikation vom Hintergrundthread zum EDT-Thread:

    • Erstellen Sie einen PropertyChangeListener und fügen Sie ihn dem SwingWorker hinzu.
    • Im done() -Methode des SwingWorkers das PropertyChangeEvent mit den gewünschten Daten auslösen.
  2. Auf Eigenschaftsänderungen im EDT-Thread warten:

    • Erstellen Sie ein Objekt, das die PropertyChangeListener-Schnittstelle implementiert.
    • Registrieren Sie diesen Listener beim SwingWorker.
    • Rufen Sie in der propertyChange()-Methode des Listeners die vom Hintergrundthread übergebenen Daten ab und verarbeiten Sie sie .

Beispielimplementierung

Der folgende Codeausschnitt zeigt, wie die oben genannten Schritte implementiert werden:

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());
        }
    }
}

Fazit

Durch die Nutzung des PropertyChangeListener-Mechanismus können SwingWorker-Klassen Daten effektiv zwischen parallelen Threads austauschen, was eine größere Flexibilität und Kontrolle in komplexen Multithread-Anwendungen ermöglicht.

Das obige ist der detaillierte Inhalt vonWie teile ich Daten zwischen zwei SwingWorker-Klassen in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn