Rumah >Java >javaTutorial >Bagaimana untuk Menguruskan Berbilang Benang SwingWorker dan Label Berkaitannya dalam JApplet?

Bagaimana untuk Menguruskan Berbilang Benang SwingWorker dan Label Berkaitannya dalam JApplet?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-20 02:33:08590semak imbas

How to Manage Multiple SwingWorker Threads and Their Associated Labels in a JApplet?

Menunggu Berbilang SwingWorkers

Masalah

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?

Penyelesaian

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn