0

我正在开发一个在 JavaFX 任务中使用多个工作线程的系统。Task 内部这些线程上的 Callable 对象使用 PropertyChangeSupport 将某些状态更改信息传回给侦听器(例如中间结果)。我正在使用 PropertyChangeListeners 来监视这些更改并从中创建衍生对象,以供其他对象访问。任务完成后,我将使用 JavaFX 显示信息,其中一些信息是从发出的 PropertyChange 事件中收集的。

我的问题是:Task 完成和 PropertyChangeEvents 被处理之间是否存在竞争条件(我认为这会发生在 JavaFX 应用程序线程上,但不完全确定)。

作为一个具体的例子,考虑一个图像被分割成块以便在多个步骤中进行处理。在每个步骤中,都会生成一个中间图像,并为该中间图像触发一个 propertyChange 事件。在处理结束时,我希望能够在 JavaFX 场景中显示最终图像以及同时生成的所有图像。propertyChange 事件会在 FX 线程重绘/刷新之前得到处理吗?

我意识到 JavaFX 文档中有一个 Task api doc 示例讨论返回中间结果(JavaFX Task API Documentation)。该示例使用 JavaFX Observable* 对象。我认为 PropertyChangeEvents 将在类似于 FX 可观察对象的同一线程上运行,因此在完成非 FX 线程和在 FX 线程上获得结果之间不应该存在竞争条件,但我想我会看看是否有任何我可能没有想到的东西。

提前感谢您的任何讨论或想法。

  • 丘克斯
4

1 回答 1

0

您是正确的,PropertyChangeEvents 将在与 FX 可观察对象相同的线程上运行。然而,这是与任务本身不同的线程。

但是,您无法保证所有 propertyChange 事件都会在 FX 线程重绘/刷新之前得到处理。实际上,显示的各个部分可能会在不同的 propertyChange 事件之间多次重绘,具体取决于它们花费的时间和所涉及的具体时间。此外,其他 FX 事件也可以散布在 propertyChange 事件和重新绘制之间。但是,您应该保证由任何给定的 propertyChange 事件更新的任何 UI 元素最终将在更新后的某个时间重新绘制。因此,显示最终将“赶上”您的 propertyChange 处理程序所做的任何更改,并最终重新绘制任何已更改的区域。

于 2014-05-20T07:14:41.043 回答