2010-06-08 82 views
2

我試圖從另一個SwingWorker(MainWorker)執行SwingWorker(SubWorker),然後我想讓MainWorker等待SubWorker完成。同時,MainWorker應根據SubWorker的屬性更改自行更新。從SwingWorker執行SwingWorker - 等待直到第一次停止

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; 
    } 
} 

的問題是,SubWorker的doInBackground方法不叫,直到MainWorker已經完成,而MainWorker正在等待SubWorker完成。

如何讓SubWorker與MainWorker的活動平行運行?

回答

3

如果你只有一個子工作者,我不確定這有什麼意義 - 爲什麼你不能在SW身上執行這個任務?

如果您有多個並行子任務,並且您想對它們進行分組並報告其進度,那麼您並不需要單獨的SwingWorkers--只需啓動線程或使用執行程序來安排任務即可。如果要發佈臨時結果,請將阻塞隊列傳遞給任務,在這裏他們將推送更新。

主要(或者說唯一的)SwingWorker會從該隊列獲取項目並使用publish()/ process()方法更新GUI。當子任務完成工作時,它可以在隊列中推送特殊標記(或空值)。這就是你如何跟蹤未完成的子任務並決定何時終止循環。

或者,如果您有一堆自包含任務,則可以使用CompletionService並以類似於SW的方式更新狀態。

+0

謝謝,使用Executor解決了這個問題。 – RemiX 2010-06-08 12:32:49