Maison >Java >javaDidacticiel >Comment gérer plusieurs threads SwingWorker et leurs étiquettes associées dans un JApplet ?

Comment gérer plusieurs threads SwingWorker et leurs étiquettes associées dans un JApplet ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-20 02:33:08561parcourir

How to Manage Multiple SwingWorker Threads and Their Associated Labels in a JApplet?

Attente de plusieurs SwingWorkers

Problème

Considérez le fragment de code suivant :

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;

public class TestApplet extends JApplet
{
    @Override
    public void init()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                @Override
                public void run()
                {
                    createGUI();
                }
            });
        }
        catch(InterruptedException | InvocationTargetException ex)
        {
        }
    }

    private void createGUI()
    {
        getContentPane().setLayout(new FlowLayout());
        JButton startButton = new JButton("Do work");
        startButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                JLabel label = new JLabel();
                new Worker(label).execute();
            }
        });
        getContentPane().add(startButton);
    }

    private class Worker extends SwingWorker<Void, Void>
    {
        JLabel label;

        public Worker(JLabel label)
        {
            this.label = label;
        }

        @Override
        protected Void doInBackground() throws Exception
        {
            // do work
            return null;
        }

        @Override
        protected void done()
        {
            getContentPane().remove(label);
            getContentPane().revalidate();
        }
    }
}

Ici, l'objectif est d'ajouter une étiquette pour l'applet qui affiche certains résultats intermédiaires du thread de travail (à l'aide des méthodes de publication/traitement). A la fin, l'étiquette est supprimée du volet de l'applet. La question est de savoir comment créer plusieurs étiquettes, chacune avec son propre thread Worker, et les supprimer une fois qu'elles sont toutes terminées ?

Solution

Un CountDownLatch fonctionne bien dans ce contexte. Dans l'exemple ci-dessous, chaque travailleur invoque latch.countDown() à la fin, et un travailleur superviseur bloque latch.await() jusqu'à ce que toutes les tâches soient terminées. À des fins de démonstration, le Superviseur met à jour les étiquettes. Le retrait en gros, indiqué dans les commentaires, est techniquement possible mais généralement peu attrayant. Envisagez plutôt une JList ou une JTable.

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.*;

/**
* @see https://stackoverflow.com/a/11372932/230513
* @see https://stackoverflow.com/a/3588523/230513
*/
public class WorkerLatchTest extends JApplet {

    private static final int N = 8;
    private static final Random rand = new Random();
    private Queue<JLabel> labels = new LinkedList<JLabel>();
    private JPanel panel = new JPanel(new GridLayout(0, 1));
    private JButton startButton = new JButton(new StartAction("Do work"));

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();

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!

Déclaration:
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