Pertimbangkan serpihan kod berikut:
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(); } } }
Di sini matlamatnya adalah untuk menambah label pada applet yang memaparkan beberapa hasil perantaraan thread Worker (menggunakan kaedah penerbitan/proses). Pada akhirnya, label dialih keluar daripada anak tetingkap applet. Persoalannya, bagaimanakah seseorang boleh membuat beberapa label, masing-masing dengan urutan Pekerjanya sendiri, dan mengalih keluarnya apabila semuanya selesai?
CountDownLatch berfungsi dengan baik dalam konteks ini. Dalam contoh di bawah, setiap pekerja memanggil latch.countDown() apabila selesai dan pekerja Penyelia menyekat pada latch.await() sehingga semua tugasan selesai. Untuk tujuan demonstrasi, Penyelia mengemas kini label. Pembuangan secara borong, ditunjukkan dalam ulasan, secara teknikal mungkin tetapi secara amnya tidak menarik. Sebaliknya, pertimbangkan JList atau 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();
Atas ialah kandungan terperinci Bagaimana untuk Menguruskan Berbilang Benang SwingWorker dan Label Berkaitannya dalam JApplet?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!