如何在 Java 中的两个 SwingWorker 类之间共享数据
简介
使用时Java 应用程序中有多个线程,有时需要在它们之间共享数据。 SwingWorker 类扩展了 SwingUtilities,提供了一种在单独线程中执行耗时任务的便捷方法,而不会阻塞主事件调度线程。
问题陈述
考虑这样一个场景,您有两个 SwingWorker 类:FileLineCounterThread 和 FileDivisionThread,每个类负责执行不同的任务。假设您要将结果从 FileLineCounterThread 传递到 FileDivisionThread。
解决方案
在 SwingWorker 类之间共享数据涉及两个步骤:
从后台线程与 EDT 通信线程:
监听属性变化在 EDT 线程中:
示例实现
以下代码片段演示了如何实现上述步骤:
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中文网其他相关文章!