首页 >Java >java教程 >在 Java 中执行长时间运行的任务时,SwingWorker 如何防止阻塞事件分发线程?

在 Java 中执行长时间运行的任务时,SwingWorker 如何防止阻塞事件分发线程?

Barbara Streisand
Barbara Streisand原创
2024-12-14 16:41:11341浏览

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

Java 中的 SwingWorker

要在 Swing 中执行长时间运行的任务而不阻塞事件调度线程 (EDT),请考虑使用 SwingWorker。本文旨在解决与上一个问题“从 Java 中的另一个类调用重绘”相关的特定用例。

了解 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 保持响应。
  • 一次任务完成后,worker 会调用 EDT 上的 did() 方法,允许您访问结果。
  • 此方法可确保 GUI 不会被长时间运行的操作阻塞。

以上是在 Java 中执行长时间运行的任务时,SwingWorker 如何防止阻塞事件分发线程?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn