SwingWorker の API ドキュメントには、次のヒントがあります。
このスレッドで doInBackground() メソッドが呼び出されます。これは、すべてのバックグラウンド アクティビティが発生する場所です。バインドされたプロパティの変更について PropertyChangeListeners に通知するには、firePropertyChange および getPropertyChangeSupport() メソッドを使用します。デフォルトでは、state と progress の 2 つのバインドされたプロパティを使用できます。
MainWorker
実装できますPropertyChangeListener
。その後、次のように自分自身を登録できますPropertyChangeSupport
。
getPropertyChangeSupport().addPropertyChangeListener( this );
MainWorker
PropertyChangeSupport
作成するすべてのオブジェクトにそのオブジェクトを提供できMyTask
ます。
new MyTask( ..., this.getPropertyChangeSupport() );
MyTask
オブジェクトは、メソッドを使用して進行状況またはプロパティの更新を通知できMainWorker
ますPropertyChangeSupport.firePropertyChange
。
MainWorker
そのように通知された は、EDT を介して Swing コンポーネントを使用SwingUtilities.invokeLater
または更新できます。SwingUtilities.invokeAndWait
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;
}