Maison > Java > javaDidacticiel > Comment SwingWorker peut-il empêcher le blocage du fil de distribution d'événements lors de l'exécution de tâches de longue durée en Java ?

Comment SwingWorker peut-il empêcher le blocage du fil de distribution d'événements lors de l'exécution de tâches de longue durée en Java ?

Barbara Streisand
Libérer: 2024-12-14 16:41:11
original
340 Les gens l'ont consulté

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

SwingWorker en Java

Pour effectuer des tâches de longue durée dans Swing sans bloquer le fil de répartition d'événements (EDT), envisagez d'utiliser SwingWorker. Cet article vise à répondre à un cas d'utilisation spécifique lié à une question précédente sur "Appeler repaint depuis une autre classe en Java."

Comprendre SwingWorker

SwingWorker vous permet d'exécuter tâches de manière asynchrone, gardant l'interface graphique réactive. Il gère l'échange de données entre la tâche en arrière-plan et l'EDT.

Implémentez SwingWorker en Java

Considérez l'extrait de code suivant, inspiré du précédent question :

// **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();
            }
        });
    }
}
Copier après la connexion

Explication :

  • Dans cet exemple, le clic sur le bouton déclenche le SwingWorker, qui exécute la tâche de longue durée en arrière-plan.
  • L'interface graphique reste réactive pendant l'exécution de la tâche.
  • Une fois la tâche terminée, le travailleur invoque la méthode done() sur l'EDT, vous permettant d'accéder au résultat.
  • Cette approche garantit que l'interface graphique n'est pas bloquée par l'opération de longue durée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal