gpt4 book ai didi

Java - SwingWorker - 我们可以从另一个 SwingWorker 而不是 EDT 调用一个 SwingWorker

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:40 26 4
gpt4 key购买 nike

我有一个 SwingWorker 如下:

public class MainWorker extends SwingWorker(Void, MyObject) {
:
:
}

我从 EDT 调用了上面的 Swing Worker:

MainWorker mainWorker = new MainWorker();
mainWorker.execute();

现在,mainWorker 创建了 10 个 MyTask 实例,每个实例都在自己的线程上运行,从而更快地完成工作。

但问题是我想在任务运行时不时更新图形用户界面。我知道如果任务是由 mainWorker 本身执行的,我可以使用 publish()process() 方法来更新 gui .

但由于任务是由不同于 Swingworker 线程的线程执行的,我如何根据执行任务的线程生成的中间结果更新 gui。

最佳答案

SwingWorker 的 API 文档提供了这样的提示:

The doInBackground() method is called on this thread. This is where all background activities should happen. To notify PropertyChangeListeners about bound properties changes use the firePropertyChange and getPropertyChangeSupport() methods. By default there are two bound properties available: state and progress.

MainWorker 可以实现PropertyChangeListener。然后它可以向其 PropertyChangeSupport 注册自己:

getPropertyChangeSupport().addPropertyChangeListener( this );

MainWorker 可以将其 PropertyChangeSupport 对象提供给它创建的每个 MyTask 对象。

new MyTask( ..., this.getPropertyChangeSupport() );

然后,MyTask 对象可以使用 PropertyChangeSupport.firePropertyChange 方法通知其 MainWorker 进度或属性更新。

MainWorker 收到通知后,可以使用 SwingUtilities.invokeLaterSwingUtilities.invokeAndWait 通过 EDT 更新 Swing 组件。

protected Void doInBackground() {
final int TASK_COUNT = 10;
getPropertyChangeSupport().addPropertyChangeListener(this);
CountDownLatch latch = new CountDownLatch( TASK_COUNT ); // java.util.concurrent
Collection<Thread> threads = new HashSet<Thread>();
for (int i = 0; i < TASK_COUNT; i++) {
MyTask task = new MyTask( ..., latch, this.getPropertyChangeSupport() ) );
threads.add( new Thread( task ) );
}
for (Thread thread: threads) {
thread.start();
}
latch.await();
return null;
}

关于Java - SwingWorker - 我们可以从另一个 SwingWorker 而不是 EDT 调用一个 SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com