如果检查事件的状态然后添加侦听器,是否有可能错过事件?

时间:2019-11-10 00:31:36

标签: javafx

假设我有一个执行一些后台任务的工作程序。这样的事情有可能发生吗?

  1. 我检查了工作人员的State,现在仍然是State.RUNNING
  2. 我在状态属性中添加一个ChangeListener,并在其完成.stateProperty().addListener((o, v1, v2) -> doSomething())时执行一个lambda
  3. 在步骤1和2之间,在后台线程中,工作程序状态更改为State.SUCCEEDED

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

如果可能的话,如何预防呢?

1 个答案:

答案 0 :(得分:3)

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

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