首页 >Java >java教程 >如何在 JApplet 中管理多个 SwingWorker 线程及其关联标签?

如何在 JApplet 中管理多个 SwingWorker 线程及其关联标签?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-20 02:33:08561浏览

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

等待多个 SwingWorkers

问题

考虑以下代码片段:

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();
        }
    }
}

这里的目标是添加小程序的标签,显示工作线程的一些中间结果(使用发布/处理方法)。最后,标签将从小程序的窗格中删除。问题是,如何创建多个标签,每个标签都有自己的工作线程,并在它们全部完成后将其删除?

解决方案

CountDownLatch 在这种情况下效果很好。在下面的示例中,每个工作线程在完成时调用latch.countDown(),并且Supervisor工作线程阻塞在latch.await()上,直到所有任务完成。出于演示目的,主管更新了标签。评论中显示的批量删除在技术上是可行的,但通常没有吸引力。相反,请考虑 JList 或 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();

以上是如何在 JApplet 中管理多个 SwingWorker 线程及其关联标签?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn