首页 > 解决方案 > 如果您检查它的状态然后添加一个监听器,是否有可能错过一个事件?

问题描述

假设我有一个运行一些后台任务的 Worker。有可能发生这样的事情吗?

  1. 我检查了State工人的,它仍然是State.RUNNING
  2. 我将一个ChangeListener带有 lambda 的 state 属性添加到它完成时执行.stateProperty().addListener((o, v1, v2) -> doSomething())
  3. 在第 1 步和第 2 步之间,在后台线程中,worker 状态更改为State.SUCCEEDED.

现在,ChangeListener永远不会触发,现在我实际上最终永远等待事件发生,因为它已经发生并且我错过了它。

如果这是可能的,我该如何预防?

标签: javafx

解决方案


只要这发生在 JavaFX 应用程序线程上并且注册侦听器发生在您在检查状态后“将控件返回给 JavaFX”之前(即它发生在同一个事件处理程序、Platform.runLater可运行/更改侦听器等中),您'将被通知更改。

原因如下: 对Task.state属性的更改是在应用程序线程上完成的,该线程是您的代码运行的线程。这意味着在您将控件返回给 JavaFX 之前,它无法对属性进行更新,并且在添加侦听器之后,属性中包含的值仍然与您读取的值相同。


推荐阅读