首页 > Java > java教程 > 正文

如何在 Java 中的两个 SwingWorker 类之间共享数据?

DDD
发布: 2024-11-18 08:44:02
原创
520 人浏览过

How to Share Data Between Two SwingWorker Classes in Java?

如何在 Java 中的两个 SwingWorker 类之间共享数据

简介

使用时Java 应用程序中有多个线程,有时需要在它们之间共享数据。 SwingWorker 类扩展了 SwingUtilities,提供了一种在单独线程中执行耗时任务的便捷方法,而不会阻塞主事件调度线程。

问题陈述

考虑这样一个场景,您有两个 SwingWorker 类:FileLineCounterThread 和 FileDivisionThread,每个类负责执行不同的任务。假设您要将结果从 FileLineCounterThread 传递到 FileDivisionThread。

解决方案

在 SwingWorker 类之间共享数据涉及两个步骤:

  1. 从后台线程与 EDT 通信线程:

    • 创建一个PropertyChangeListener并将其添加到SwingWorker。
    • 在SwingWorker的done()方法中,用所需的数据触发PropertyChangeEvent。
  2. 监听属性变化在 EDT 线程中:

    • 创建一个实现 PropertyChangeListener 接口的对象。
    • 向 SwingWorker 注册此侦听器。
    • 在 propertyChange() 中监听器的方法,检索并处理后台传来的数据

示例实现

以下代码片段演示了如何实现上述步骤:

import javax.swing.SwingWorker;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class DataSharingSwingWorker {

    public static void main(String[] args) {
        // Create the SwingWorker instances
        SwingWorker<Integer, Void> lineCounterWorker = new LineCounterWorker();
        SwingWorker<String, Void> divisionWorker = new DivisionWorker();

        // Add a listener to the line counter worker
        lineCounterWorker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("result".equals(evt.getPropertyName())) {
                    // Retrieve the line count from the event
                    int lineCount = (int) evt.getNewValue();

                    // Pass the line count to the division worker
                    divisionWorker.passData(lineCount);
                }
            }
        });

        // Execute the workers
        lineCounterWorker.execute();
        divisionWorker.execute();
    }

    private static class LineCounterWorker extends SwingWorker<Integer, Void> {
        @Override
        protected Integer doInBackground() throws Exception {
            // Perform line counting
            return null; // Placeholder for line count
        }

        @Override
        protected void done() {
            firePropertyChange("result", null, get());
        }
    }

    private static class DivisionWorker extends SwingWorker<String, Void> {
        private int lineCount;

        public void passData(int lineCount) {
            this.lineCount = lineCount;
        }

        @Override
        protected String doInBackground() throws Exception {
            // Perform division operation based on the line count
            return null; // Placeholder for division result
        }

        @Override
        protected void done() {
            System.out.println("Division result: " + get());
        }
    }
}
登录后复制

结论

通过利用PropertyChangeListener 机制,SwingWorker 类可以有效地在并行线程之间共享数据,从而在复杂的多线程应用程序中提供更大的灵活性和控制力。

以上是如何在 Java 中的两个 SwingWorker 类之间共享数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板