Warten auf mehrere SwingWorker
Bei dieser Frage geht es darum, wie man mehrere SwingWorker erstellt, von denen jeder für die Aktualisierung eines Labels verantwortlich ist, und wie man alle Labels entfernt, wenn alle Worker sind fertig.
Eine Lösung besteht darin, einen CountDownLatch zu verwenden, der es einem Thread ermöglicht, auf eine bestimmte Anzahl anderer Threads zu warten ihre Aufgaben abzuschließen, bevor sie mit der Ausführung fortfahren. Im bereitgestellten Code ruft jeder Worker nach Abschluss die Funktion „latch.countDown()“ auf, während ein Supervisor-Worker die Funktion „latch.await()“ blockiert, bis alle Aufgaben abgeschlossen sind. Der Supervisor aktualisiert dann die Beschriftungen oder entfernt sie ganz (wobei letztere Option im Allgemeinen unattraktiv ist).
Hier ist ein erweitertes Codebeispiel, das diesen Ansatz demonstriert:
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();
Das obige ist der detaillierte Inhalt vonWie verwaltet man mehrere SwingWorker und aktualisiert Etiketten effizient?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!