Maison > Java > javaDidacticiel > Comment CountDownLatch peut-il garantir la cohérence de l'interface utilisateur lorsque plusieurs SwingWorkers terminent ?

Comment CountDownLatch peut-il garantir la cohérence de l'interface utilisateur lorsque plusieurs SwingWorkers terminent ?

Patricia Arquette
Libérer: 2024-12-15 12:06:15
original
119 Les gens l'ont consulté

How Can CountDownLatch Ensure UI Consistency When Multiple SwingWorkers Finish?

En attente de l'achèvement de plusieurs SwingWorkers

Considérez le scénario suivant : plusieurs SwingWorkers s'exécutent simultanément, représentant diverses tâches. L'exigence est de supprimer toutes les étiquettes associées, représentant la progression de la tâche, de la fenêtre de l'application une fois que toutes les tâches sont terminées.

Le défi consiste à garantir que la suppression des étiquettes n'est effectuée qu'une fois que tous les SwingWorkers ont terminé leur exécution. . Ceci est essentiel pour éviter tout scintillement inutile ou comportement incohérent dans l'interface utilisateur.

Mise en œuvre d'une solution à l'aide de CountDownLatch

Une approche appropriée pour gérer ce problème consiste à utiliser un CountDownLatch. Cette construction fournit un mécanisme de synchronisation qui permet à un thread d'attendre qu'un nombre spécifié d'événements se soient produits. Dans ce contexte spécifique, le CountDownLatch est initialisé avec un nombre égal au nombre de SwingWorkers. Chaque thread de travail est chargé de décrémenter le nombre de verrous une fois terminé.

Un SwingWorker distinct, agissant en tant que « superviseur », est utilisé pour surveiller le verrou. Ce travailleur superviseur bloque la méthode CountDownLatch.await(), faisant effectivement une pause jusqu'à ce que tous les autres SwingWorkers aient signalé leur achèvement. Une fois que le nombre de verrous atteint zéro, le superviseur procède à la suppression de toutes les étiquettes de la fenêtre de l'application.

Exemple d'illustration de code

L'extrait de code suivant démontre la mise en œuvre de cette solution :

import java.util.concurrent.CountDownLatch;

...

private class Supervisor extends SwingWorker<Void, Void> {

    CountDownLatch latch;

    public Supervisor(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    protected Void doInBackground() throws Exception {
        latch.await();
        return null;
    }

    @Override
    protected void done() {
        for (JLabel label : labels) {
            label.setText("Fin!");
            label.setBackground(Color.lightGray);
        }
        startButton.setEnabled(true);
        //panel.removeAll(); panel.revalidate(); panel.repaint();
    }
}

...

private static class Counter extends SwingWorker<Void, Integer> {

    private JLabel label;
    CountDownLatch latch;

    public Counter(JLabel label, CountDownLatch latch) {
        this.label = label;
        this.latch = latch;
    }

    @Override
    protected Void doInBackground() throws Exception {
        int latency = rand.nextInt(42) + 10;
        for (int i = 1; i <= 100; i++) {
            publish(i);
            Thread.sleep(latency);
        }
        return null;
    }

    @Override
    protected void process(List<Integer> values) {
        label.setText(values.get(values.size() - 1).toString());
    }

    @Override
    protected void done() {
        label.setBackground(Color.green);
        latch.countDown();
    }
}
Copier après la connexion

Dans cette implémentation, le CountDownLatch agit efficacement comme un gardien, garantissant que la suppression de l'étiquette n'est exécutée qu'une fois que tous les SwingWorkers ont terminé leurs tâches. Cette approche favorise une interface utilisateur propre et cohérente en évitant les artefacts visuels inutiles lors des opérations asynchrones.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal