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:
Kommunikation vom Hintergrundthread zum EDT-Thread:
Auf Eigenschaftsänderungen im EDT-Thread warten:
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!