Rumah >Java >javaTutorial >Bagaimanakah SwingWorker Boleh Menghalang Menyekat Benang Penghantaran Acara Apabila Melaksanakan Tugasan Jangka Panjang di Java?

Bagaimanakah SwingWorker Boleh Menghalang Menyekat Benang Penghantaran Acara Apabila Melaksanakan Tugasan Jangka Panjang di Java?

Barbara Streisand
Barbara Streisandasal
2024-12-14 16:41:11347semak imbas

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

SwingWorker in Java

Untuk melaksanakan tugasan jangka panjang dalam Swing tanpa menyekat Event Dispatch Thread (EDT), pertimbangkan untuk menggunakan SwingWorker. Artikel ini bertujuan untuk menangani kes penggunaan khusus yang berkaitan dengan soalan sebelumnya tentang "Memanggil cat semula daripada kelas lain di Java."

Memahami SwingWorker

SwingWorker membolehkan anda menjalankan tugasan secara tidak segerak, memastikan GUI responsif. Ia mengendalikan pertukaran data antara tugas latar belakang dan EDT.

Laksanakan SwingWorker dalam Java

Pertimbangkan coretan kod berikut, diilhamkan oleh yang sebelumnya soalan:

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

Penjelasan:

  • Dalam contoh ini, klik butang mencetuskan SwingWorker, yang melaksanakan tugas yang sudah lama berjalan di latar belakang.
  • GUI kekal responsif semasa tugasan dijalankan.
  • Sebaik sahaja tugas selesai, pekerja menggunakan kaedah done() pada EDT, membolehkan anda mengakses hasilnya.
  • Pendekatan ini memastikan GUI tidak disekat oleh operasi yang berjalan lama.

Atas ialah kandungan terperinci Bagaimanakah SwingWorker Boleh Menghalang Menyekat Benang Penghantaran Acara Apabila Melaksanakan Tugasan Jangka Panjang di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn