> Java > java지도 시간 > Java에서 장기 실행 작업을 수행할 때 SwingWorker가 이벤트 디스패치 스레드 차단을 어떻게 방지할 수 있습니까?

Java에서 장기 실행 작업을 수행할 때 SwingWorker가 이벤트 디스패치 스레드 차단을 어떻게 방지할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-14 16:41:11
원래의
340명이 탐색했습니다.

How Can SwingWorker Prevent Blocking the Event Dispatch Thread When Performing Long-Running Tasks in Java?

Java의 SwingWorker

EDT(이벤트 디스패치 스레드)를 차단하지 않고 Swing에서 장기 실행 작업을 수행하려면 SwingWorker 활용을 고려해 보세요. 이 기사는 "Java의 다른 클래스에서 repaint 호출"에 대한 이전 질문과 관련된 특정 사용 사례를 다루는 것을 목표로 합니다.

SwingWorker 이해

SwingWorker를 사용하면 다음을 실행할 수 있습니다. 작업을 비동기적으로 수행하여 GUI의 응답성을 유지합니다. 백그라운드 작업과 EDT 간의 데이터 교환을 처리합니다.

Java에서 SwingWorker 구현

이전 코드에서 영감을 받은 다음 코드 조각을 고려하세요. 질문:

// **illustrates previous example**
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.SwingWorker;

public class SwingWorkerExample {

    private static void main(String[] args) {
        // Initialize GUI
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());

        // Create and add a button to trigger the SwingWorker
        JButton button = new JButton("Start Async Task");
        panel.add(button);
        f.add(panel);
        f.pack();
        f.setVisible(true);

        // SwingWorker to perform the task
        SwingWorker<Integer, Void> worker = new SwingWorker<Integer, Void>() {

            // executed on a background thread:
            @Override
            protected Integer doInBackground() throws Exception {
                // simulate a heavy task:
                Thread.sleep(3000); // replace with actual code...
                return 42; // return an integer result...
            }

            // executed on the EDT after doInBackground completes:
            @Override
            protected void done() {
                try {
                    // get the result of the SwingWorker:
                    int result = get();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };

        // ActionListener for the button:
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // start the SwingWorker when the button is clicked:
                worker.execute();
            }
        });
    }
}
로그인 후 복사

설명:

  • 이 예에서 버튼 클릭은 백그라운드에서 장기 실행 작업을 실행하는 SwingWorker를 트리거합니다.
  • 작업이 실행되는 동안 GUI는 계속 응답합니다.
  • 한 번 작업이 완료되면 작업자는 EDT에서 done() 메서드를 호출하여 결과에 액세스할 수 있도록 합니다.
  • 이 접근 방식을 사용하면 장기 실행 작업으로 인해 GUI가 차단되지 않습니다.

위 내용은 Java에서 장기 실행 작업을 수행할 때 SwingWorker가 이벤트 디스패치 스레드 차단을 어떻게 방지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿