Heim > Java > javaLernprogramm > Wie kann SwingWorker das Blockieren des Event-Dispatch-Threads verhindern, wenn in Java lang laufende Aufgaben ausgeführt werden?

Wie kann SwingWorker das Blockieren des Event-Dispatch-Threads verhindern, wenn in Java lang laufende Aufgaben ausgeführt werden?

Barbara Streisand
Freigeben: 2024-12-14 16:41:11
Original
340 Leute haben es durchsucht

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

SwingWorker in Java

Um lang laufende Aufgaben in Swing auszuführen, ohne den Event Dispatch Thread (EDT) zu blockieren, sollten Sie die Verwendung von SwingWorker in Betracht ziehen. Dieser Artikel befasst sich mit einem spezifischen Anwendungsfall im Zusammenhang mit einer früheren Frage zum „Aufrufen von Repaint aus einer anderen Klasse in Java“.

SwingWorker verstehen

SwingWorker ermöglicht die Ausführung Aufgaben asynchron ausführen und die GUI reaktionsfähig halten. Es übernimmt den Datenaustausch zwischen der Hintergrundaufgabe und dem EDT.

Implementieren Sie SwingWorker in Java

Bedenken Sie den folgenden Codeausschnitt, der vom vorherigen inspiriert ist Frage:

// **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();
            }
        });
    }
}
Nach dem Login kopieren

Erklärung:

  • In diesem Beispiel löst der Tastenklick den SwingWorker aus, der die lang laufende Aufgabe im Hintergrund ausführt.
  • Die GUI bleibt reaktionsfähig, während die Aufgabe ausgeführt wird.
  • Sobald die Aufgabe abgeschlossen ist, wird die Der Worker ruft die Methode done() im EDT auf, sodass Sie auf das Ergebnis zugreifen können.
  • Dieser Ansatz stellt sicher, dass die GUI nicht durch den lang andauernden Vorgang blockiert wird.

Das obige ist der detaillierte Inhalt vonWie kann SwingWorker das Blockieren des Event-Dispatch-Threads verhindern, wenn in Java lang laufende Aufgaben ausgeführt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage