我正在尝试从另一个SwingWorker(MainWorker)执行SwingWorker(SubWorker),然后我希望MainWorker等待SubWorker完成。同时,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的doInBackground方法,而MainWorker正在等待SubWorker完成。
如何让SubWorker与MainWorker的活动并行运行?
答案 0 :(得分:3)
如果你只有一个子工作者,我不确定是什么意思 - 为什么你不能在SW体内执行任务?
如果您有多个并行子任务,并且想要对它们进行分组并报告它们的进度,那么您实际上并不需要单独的SwingWorkers - 只需启动线程或使用执行程序来安排任务。如果要发布中间结果,请将阻塞队列传递给任务,以便推送更新。
主要(或者说是唯一的)SwingWorker将从该队列中获取项目并使用publish()/ process()方法更新GUI。当子任务完成工作时,它可以在队列中推送特殊标记(或null)。这就是你如何跟踪未完成的子任务并决定何时终止循环。
或者,如果您有一堆自包含的任务,则可以使用CompletionService并以类似的方式从SW更新状态。