Maison > Java > javaDidacticiel > le corps du texte

Comment partager des données entre deux classes SwingWorker en Java ?

DDD
Libérer: 2024-11-18 08:44:02
original
521 Les gens l'ont consulté

How to Share Data Between Two SwingWorker Classes in Java?

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 :

  1. Communication du fil d'arrière-plan vers l'EDT thread:

    • Créez un PropertyChangeListener et ajoutez-le au SwingWorker.
    • Dans la méthode done() du SwingWorker, déclenchez le PropertyChangeEvent avec les données souhaitées.
  2. Écoute des changements de propriété dans l'EDT thread :

    • Créez un objet qui implémente l'interface PropertyChangeListener.
    • Enregistrez cet écouteur auprès du SwingWorker.
    • Dans la méthode propertyChange() du écouteur, récupère et gère les données transmises depuis l'arrière-plan 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());
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal