Comment partager des données entre deux classes SwingWorker en Java
Introduction
Lorsque vous travaillez avec plusieurs threads dans une application Java, il devient parfois nécessaire de partager des données entre eux. La classe SwingWorker, qui étend SwingUtilities, offre un moyen pratique d'effectuer des tâches fastidieuses dans un thread séparé, sans bloquer le thread principal de répartition des événements.
Énoncé du problème
Considérons un scénario dans lequel vous disposez de deux classes SwingWorker, FileLineCounterThread et FileDivisionThread, chacune chargée d'effectuer des tâches différentes. Supposons que vous souhaitiez transmettre le résultat du FileLineCounterThread au FileDivisionThread.
Solution
Le partage de données entre les classes SwingWorker implique deux étapes :
Communication du fil d'arrière-plan vers l'EDT thread:
Écoute des changements de propriété dans l'EDT thread :
Exemple de mise en œuvre
L'extrait de code suivant montre comment implémenter les étapes ci-dessus :
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()); } } }
Conclusion
En tirant parti du PropertyChangeListener mécanisme, les classes SwingWorker peuvent partager efficacement des données entre des threads parallèles, permettant une plus grande flexibilité et un plus grand contrôle dans les applications multithread complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!