2

別の SwingWorker (MainWorker) から SwingWorker (SubWorker) を実行しようとしていますが、SubWorker が完了するまで MainWorker を待機させたいと考えています。それまでの間、MainWorker は SubWorker のプロパティの変更に従って自身を更新する必要があります。

public class MainWorker extends SwingWorker<Void,Void>
{
    public Void doInBackground()
    {
        SubWorker sw = new SubWorker();
        sw.execute();
        try {
            network.get(); // wait for completion
        } catch (Exception ex) {
        }
        return null;
    }
}

問題は、MainWorker が SubWorker の終了を待っている間に、MainWorker が終了するまで SubWorker の doInBackground メソッドが呼び出されないことです。

SubWorker を MainWorker のアクティビティと並行して実行するにはどうすればよいですか?

4

1 に答える 1

3

サブワーカーが 1 つしかない場合、何がポイントなのかわかりません。SW 本体でタスクを実行できないのはなぜですか?

複数の並列サブタスクがあり、それらをグループ化して進行状況を報告したい場合、個別の SwingWorker は実際には必要ありません。スレッドを開始するか、executor を使用してタスクをスケジュールするだけです。中間結果を公開する場合は、ブロック キューをタスクに渡します。タスクはそこで更新をプッシュします。

メインの (または唯一の) SwingWorker は、そのキューから項目を取得し、publish()/process() メソッドを使用して GUI を更新します。サブタスクが作業を終了すると、特別なトークンをキュー (または null) にプッシュできます。これにより、未処理のサブタスクを追跡し、いつループを終了するかを決定できます。

または、自己完結型のタスクが多数ある場合は、CompletionService を使用して、SW から同様の方法でステータスを更新できます。

于 2010-06-08T10:34:30.413 に答える