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!