다음 시나리오를 고려하십시오. 여러 SwingWorker가 동시에 실행되어 다양한 작업을 나타냅니다. 요구 사항은 모든 작업이 완료된 후 응용 프로그램 창에서 작업 진행 상황을 나타내는 모든 관련 레이블을 제거하는 것입니다.
문제는 모든 SwingWorker가 실행을 마친 후에만 레이블 제거가 수행되도록 하는 것입니다. . 이는 UI에서 불필요한 깜박임이나 일관되지 않은 동작을 방지하는 데 필수적입니다.
이 문제를 처리하는 데 적합한 접근 방식은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!