여러 SwingWorker를 기다리는 중
이 질문은 각각 레이블 업데이트를 담당하는 여러 SwingWorker를 생성하고, 업데이트가 완료되면 모든 레이블을 제거하는 방법을 묻습니다. 모든 작업자가 작업을 완료했습니다.
한 가지 해결책은 스레드가 다음을 기다릴 수 있도록 하는 CountDownLatch를 사용하는 것입니다. 실행을 재개하기 전에 작업을 완료하기 위해 지정된 수의 다른 스레드. 제공된 코드에서 각 작업자는 완료 시 래치.countDown()을 호출하는 반면 감독자 작업자는 모든 작업이 완료될 때까지 래치.await()를 차단합니다. 그런 다음 감독자는 레이블을 업데이트하거나 완전히 제거합니다(후자의 옵션은 일반적으로 매력적이지 않습니다).
다음은 이 접근 방식을 보여주는 향상된 코드 예제입니다.
import java.awt.Color; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; /** * @see https://stackoverflow.com/a/11372932/230513 * @see https://stackoverflow.com/a/3588523/230513 */ public class WorkerLatchTest extends JApplet { private static final int N = 8; private static final Random rand = new Random(); private Queue<JLabel> labels = new LinkedList<JLabel>(); private JPanel panel = new JPanel(new GridLayout(0, 1)); private JButton startButton = new JButton(new StartAction("Do work")); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame();
위 내용은 여러 SwingWorker를 관리하고 라벨을 효율적으로 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!