Stellen Sie sich das folgende Szenario vor: Mehrere SwingWorker werden gleichzeitig ausgeführt und repräsentieren verschiedene Aufgaben. Die Anforderung besteht darin, alle zugehörigen Beschriftungen, die den Aufgabenfortschritt darstellen, aus dem Anwendungsfenster zu entfernen, sobald alle Aufgaben abgeschlossen sind.
Die Herausforderung besteht darin, sicherzustellen, dass die Beschriftung erst dann entfernt wird, wenn alle SwingWorker ihre Ausführung abgeschlossen haben . Dies ist wichtig, um unnötiges Flackern oder inkonsistentes Verhalten in der Benutzeroberfläche zu verhindern.
Ein geeigneter Ansatz zur Lösung dieses Problems ist die Verwendung eines CountDownLatch. Dieses Konstrukt stellt einen Synchronisierungsmechanismus bereit, der es einem Thread ermöglicht, zu warten, bis eine bestimmte Anzahl von Ereignissen aufgetreten ist. In diesem speziellen Kontext wird CountDownLatch mit einer Anzahl initialisiert, die der Anzahl der SwingWorker entspricht. Jeder Arbeitsthread ist dafür verantwortlich, die Latch-Anzahl nach Abschluss zu verringern.
Ein separater SwingWorker, der als „Supervisor“ fungiert, wird zur Überwachung des Latchs eingesetzt. Dieser Supervisor-Worker blockiert die CountDownLatch.await()-Methode und hält praktisch an, bis alle anderen SwingWorker ihren Abschluss signalisiert haben. Sobald die Latch-Zählung Null erreicht, entfernt der Vorgesetzte alle Beschriftungen aus dem Anwendungsfenster.
Der folgende Codeausschnitt demonstriert die Implementierung dieser Lösung:
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(); } }
In dieser Implementierung fungiert der CountDownLatch effektiv als Gatekeeper und stellt sicher, dass die Etikettenentfernung erst ausgeführt wird, nachdem alle SwingWorker ihre Aufgaben abgeschlossen haben. Dieser Ansatz fördert eine saubere und konsistente Benutzeroberfläche, indem unnötige visuelle Artefakte bei asynchronen Vorgängen vermieden werden.
Das obige ist der detaillierte Inhalt vonWie kann CountDownLatch die Konsistenz der Benutzeroberfläche sicherstellen, wenn mehrere SwingWorker fertig sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!