Maison >Java >javaDidacticiel >Comment gérer plusieurs threads SwingWorker et leurs étiquettes associées dans un JApplet ?
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 ?
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!