2

我正在尝试从另一个 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;
    }
}

问题是 SubWorker 的 doInBackground 方法在 MainWorker 完成之前不会被调用,而 MainWorker 正在等待 SubWorker 完成。

如何让 SubWorker 与 MainWorker 的活动并行运行?

4

1 回答 1

3

如果你只有一个子工作者,我不确定有什么意义——你为什么不能在 SW 正文中执行任务?

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

主要的(或者更确切地说是唯一的)SwingWorker 将从该队列中获取项目并使用 publish()/process() 方法更新 GUI。当子任务完成工作时,它可以将特殊令牌推送到队列中(或为空)。这就是您可以跟踪未完成的子任务并决定何时终止循环的方式。

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

于 2010-06-08T10:34:30.413 回答