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

2024-05-06

我有一个SwingWorker如下:

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

我调用了上面的Swing Worker来自东部夏令时间:

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

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

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

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


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

调用 doInBackground() 方法 在这个线程上。这就是所有 应该发生后台活动。 通知 PropertyChangeListener 关于绑定属性更改使用 firePropertyChange 和 getPropertyChangeSupport() 方法。经过 默认有两个绑定属性 可用:状态和进度。

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

getPropertyChangeSupport().addPropertyChangeListener( this );

MainWorker可以供应其PropertyChangeSupport反对每一个MyTask它创建的对象。

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

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

MainWorker,如此通知,然后可以使用SwingUtilities.invokeLater or SwingUtilities.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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - SwingWorker - 我们可以从其他 SwingWorker 调用一个 SwingWorker 而不是 EDT 的相关文章

随机推荐