SwingWorker 的 API 文档提供了以下提示:
在此线程上调用 doInBackground() 方法。这是所有后台活动都应该发生的地方。要通知 PropertyChangeListener 绑定的属性更改,请使用 firePropertyChange 和 getPropertyChangeSupport() 方法。默认情况下,有两个可用的绑定属性:状态和进度。
MainWorker
可以实施PropertyChangeListener
。然后它可以用它自己注册PropertyChangeSupport
:
getPropertyChangeSupport().addPropertyChangeListener( this );
MainWorker
可以将其对象提供给它创建PropertyChangeSupport
的每个对象。MyTask
new MyTask( ..., this.getPropertyChangeSupport() );
然后,对象可以使用方法MyTask
通知其进度或属性更新。MainWorker
PropertyChangeSupport.firePropertyChange
MainWorker
,收到通知后,就可以通过 EDT 使用SwingUtilities.invokeLater
或SwingUtilities.invokeAndWait
更新 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;
}