Maison >Java >javaDidacticiel >Comment gérer plusieurs SwingWorkers et mettre à jour les étiquettes efficacement ?

Comment gérer plusieurs SwingWorkers et mettre à jour les étiquettes efficacement ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-11 16:14:11274parcourir

How to Manage Multiple SwingWorkers and Update Labels Efficiently?

En attente de plusieurs SwingWorkers

Cette question demande comment créer plusieurs SwingWorkers, chacun responsable de la mise à jour d'une étiquette, et supprimer toutes les étiquettes lorsque tous les travailleurs ont terminé.

Une solution consiste à utiliser un CountDownLatch, qui permet à un thread d'attendre un nombre spécifié d'autres threads. pour terminer leurs tâches avant de reprendre l'exécution. Dans le code fourni, chaque travailleur invoque latch.countDown() à la fin, tandis qu'un travailleur superviseur bloque latch.await() jusqu'à ce que toutes les tâches soient terminées. Le superviseur met ensuite à jour les étiquettes ou les supprime complètement (bien que cette dernière option soit généralement peu attrayante).

Voici un exemple de code amélioré qui illustre cette approche :

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