从SwingWorker执行SwingWorker - 等待直到第一次停止
问题描述:
我试图从另一个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的活动平行运行?
答
如果你只有一个子工作者,我不确定这有什么意义 - 为什么你不能在SW身上执行这个任务?
如果您有多个并行子任务,并且您想对它们进行分组并报告其进度,那么您并不需要单独的SwingWorkers--只需启动线程或使用执行程序来安排任务即可。如果要发布临时结果,请将阻塞队列传递给任务,在这里他们将推送更新。
主要(或者说唯一的)SwingWorker会从该队列获取项目并使用publish()/ process()方法更新GUI。当子任务完成工作时,它可以在队列中推送特殊标记(或空值)。这就是你如何跟踪未完成的子任务并决定何时终止循环。
或者,如果您有一堆自包含任务,则可以使用CompletionService并以类似于SW的方式更新状态。
谢谢,使用Executor解决了这个问题。 – RemiX 2010-06-08 12:32:49