Heim >Java >javaLernprogramm >Wie kann CountDownLatch die Konsistenz der Benutzeroberfläche sicherstellen, wenn mehrere SwingWorker fertig sind?

Wie kann CountDownLatch die Konsistenz der Benutzeroberfläche sicherstellen, wenn mehrere SwingWorker fertig sind?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-15 12:06:15120Durchsuche

How Can CountDownLatch Ensure UI Consistency When Multiple SwingWorkers Finish?

Warten auf den Abschluss mehrerer SwingWorker

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.

Implementieren einer Lösung mit CountDownLatch

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.

Beispielcode-Illustration

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn