Maison >Java >javaDidacticiel >Comment CountDownLatch peut-il garantir la cohérence de l'interface utilisateur lorsque plusieurs SwingWorkers terminent ?
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.
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.
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(); } }
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!