如何正确使用SwingWorker上的publish()和process()方法?

SwingWorker中的这两个方法目前让我感到困惑,而且似乎很容易错误地使用它们。

方法publish()描述了以下内容:

将数据块发送到进程(java.util.List)方法。 此方法将在doInBackground方法内部使用,以在流程方法内的事件调度线程上提供中间结果以进行处理。

这对我来说意味着当我的工作线程正在执行其doInBackground()方法时,我能够创建“块”(这些是不是特定的或者这只是一种引用消息对象的方法?),然后发布它们在我的Swing GUI上处理。

这导致我进行处理() 。 javadoc概述了以下内容:

在Event Dispatch Thread上异步接收来自publish方法的数据块。

在查看了这两种方法的文档后,是否有人可以澄清这种方法背后的机制是什么? 据我所知,这是一个异步过程,但由于它是在EDT上进行的,我想象中有一些可预测性。

publish()文档说明了这一点:

因为在Event Dispatch Thread上异步调用了process方法,所以在执行process方法之前可能会对publish方法进行多次调用。 出于性能目的,所有这些调用都合并为一个带有连接参数的调用。

总结一下,我的问题有两个:

  • 谁应该调用process()
  • 在SwingWorker和EDT的上下文中, process()的工作流程是什么?

如果需要澄清,请告诉我。

我编写了一个程序来处理子树中的目录。 处理过程需要足够长的时间,以至于用户需要一些正在进行的反馈。 我建立了一个对话框,其中包含一个标签,其中包含当前正在处理的子目录的名称; swingworker线程调用publish(),其中包含正在处理的每个目录的名称。

无法保证为每个目录名更新UI – 有时处理速度比重新显示更快,特别是如果计算机上发生了其他任何事情,并且取决于运行的计算机。 因此,可以调用publish()并执行多次,而不会由Swing运行时调用process()。

正如已经指出的那样,您的代码不会调用进程 – 在您调用publish之后代表您调用,而且每次调用publish()时都可能不会调用。

这有什么事要清楚吗?

您应该调用publish()来添加要由process()方法处理的数据。

可以从任何线程调用publish方法。

处理方法在EDT线程中执行,因此您可以在EDT线程内更改仅允许这样做的GUI内容,因此您不应自行调用process()方法。

你可以决定你的进程()必须做什么,但要记住它在EDT线程中运行,所以它应该很快完成。