JavaFX工作线程和PropertyChangeSupport的竞争条件

时间:2013-09-13 21:20:20

标签: concurrency javafx

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

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

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

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

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

  • Chooks

1 个答案:

答案 0 :(得分:0)

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

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