我有一个SwingWorker
,如下所示:
public class MainWorker extends SwingWorker(Void, MyObject) {
:
:
}
我从EDT调用了上面的
Swing Worker
:MainWorker mainWorker = new MainWorker();
mainWorker.execute();
现在,
mainWorker
创建MyTask
类的10个实例,以便每个实例将在其自己的线程上运行,从而更快地完成工作。但是问题是我想在任务运行时不时更新gui。我知道,如果任务是由
mainWorker
本身执行的,则可以使用publish()
和process()
方法来更新gui。但是由于任务是由与
Swingworker
线程不同的线程执行的,因此如何从执行任务的线程生成的中间结果中更新gui。 最佳答案
SwingWorker的API文档提供了以下提示:
调用doInBackground()方法
在这个线程上。这是所有
应该进行后台 Activity 。
通知PropertyChangeListeners
关于绑定属性的更改,请使用
firePropertyChange和
getPropertyChangeSupport()方法。通过
默认有两个绑定属性
可用:状态和进度。MainWorker
可以实现PropertyChangeListener
。然后可以使用PropertyChangeSupport
注册自己:
getPropertyChangeSupport().addPropertyChangeListener( this );
MainWorker
可以为其创建的每个PropertyChangeSupport
对象提供其MyTask
对象。new MyTask( ..., this.getPropertyChangeSupport() );
然后,
MyTask
对象可以使用MainWorker
方法将其进度或属性更新通知给PropertyChangeSupport.firePropertyChange
。如此通知的
MainWorker
然后可以使用SwingUtilities.invokeLater
或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;
}