从SwingWorker执行SwingWorker - 等到第一个停止

时间:2010-06-08 10:20:44

标签: java multithreading parallel-processing swingworker

我正在尝试从另一个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的活动并行运行?

1 个答案:

答案 0 :(得分:3)

如果你只有一个子工作者,我不确定是什么意思 - 为什么你不能在SW体内执行任务?

如果您有多个并行子任务,并且想要对它们进行分组并报告它们的进度,那么您实际上并不需要单独的SwingWorkers - 只需启动线程或使用执行程序来安排任务。如果要发布中间结果,请将阻塞队列传递给任务,以便推送更新。

主要(或者说是唯一的)SwingWorker将从该队列中获取项目并使用publish()/ process()方法更新GUI。当子任务完成工作时,它可以在队列中推送特殊标记(或null)。这就是你如何跟踪未完成的子任务并决定何时终止循环。

或者,如果您有一堆自包含的任务,则可以使用CompletionService并以类似的方式从SW更新状态。