>Java >java지도 시간 >여러 SwingWorker가 완료될 때 CountDownLatch가 UI 일관성을 어떻게 보장할 수 있습니까?

여러 SwingWorker가 완료될 때 CountDownLatch가 UI 일관성을 어떻게 보장할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-15 12:06:15122검색

How Can CountDownLatch Ensure UI Consistency When Multiple SwingWorkers Finish?

여러 SwingWorker 완료 대기

다음 시나리오를 고려하십시오. 여러 SwingWorker가 동시에 실행되어 다양한 작업을 나타냅니다. 요구 사항은 모든 작업이 완료된 후 응용 프로그램 창에서 작업 진행 상황을 나타내는 모든 관련 레이블을 제거하는 것입니다.

문제는 모든 SwingWorker가 실행을 마친 후에만 레이블 제거가 수행되도록 하는 것입니다. . 이는 UI에서 불필요한 깜박임이나 일관되지 않은 동작을 방지하는 데 필수적입니다.

CountDownLatch를 사용하여 솔루션 구현

이 문제를 처리하는 데 적합한 접근 방식은 CountDownLatch를 사용하는 것입니다. 이 구성은 지정된 수의 이벤트가 발생할 때까지 하나의 스레드가 대기할 수 있도록 하는 동기화 메커니즘을 제공합니다. 이 특정 컨텍스트에서 CountDownLatch는 SwingWorkers 수와 동일한 개수로 초기화됩니다. 각 작업자 스레드는 완료 시 래치 수를 감소시키는 역할을 담당합니다.

"감독자" 역할을 하는 별도의 SwingWorker가 래치를 모니터링하는 데 사용됩니다. 이 감독 작업자는 CountDownLatch.await() 메서드를 차단하여 다른 모든 SwingWorker가 완료 신호를 보낼 때까지 효과적으로 일시 중지합니다. 래치 수가 0에 도달하면 감독 작업자는 애플리케이션 창에서 모든 레이블을 제거합니다.

샘플 코드 그림

다음 코드 조각은 이 솔루션의 구현을 보여줍니다.

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();
    }
}

이 구현에서 CountDownLatch는 효과적으로 게이트키퍼 역할을 하여 모든 SwingWorker가 작업을 완료한 후에만 라벨 제거가 실행되도록 보장합니다. 작업. 이 접근 방식은 비동기 작업 중에 불필요한 시각적 아티팩트를 방지하여 깔끔하고 일관된 사용자 인터페이스를 촉진합니다.

위 내용은 여러 SwingWorker가 완료될 때 CountDownLatch가 UI 일관성을 어떻게 보장할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.