2013-12-15 18 views
2

如果我添加的onChange聽衆一個JavaFX財產,JavaFX的財產聽衆訂貨

  1. 是聽衆的順序調用?如果我有一個字符串屬性,然後將字符串轉換爲「Alice」,然後轉換爲「Bob」,我保證在看到「Bob」之前看到「Alice」。實際上,只要我看不到「Bob」後我是否在意是否看到「Alice」
  2. 是否按順序調用偵聽器?我的聽衆是否有可能同時被「Alice」和「Bob」通知調用?

回答

2

注意:您的問題尚不清楚 - 您似乎在詢問觀察事件的順序,而不是調用監聽器的順序(在您的示例中只有一個監聽器)。我會回答事件訂購部分。

長話短說:FX屬性不是線程安全的。只要您在外匯線程中處理屬性,事件將按順序觸發,但是如果您從其他線程訪問屬性,則將應用線程安全的一般規則。

換句話說:

  • 如果屬性只有FX線程訪問(這是改變由於用戶交互操作的控件的屬性的情況下),包括在您註冊監聽器,或者如果您以編程方式設置屬性的值,然後事件將在FX線程上觸發並按順序顯示。因此,如果用戶鍵入Alice然後鍵入Bob,則您的收聽者將收到Alice,然後收到Bob。
  • 如果您手動創建屬性或更新控件的屬性,但您在沒有正確同步的情況下開始玩線程,則所有投注都將關閉。特別是,如果你寫:

    • 在線程property.addListener(myListener)一個
    • property.set("Alice")在線程B
    • property.set("Bob")在線程C-

    你的聽衆可能會或可能不會看到「愛麗絲」,它可能或者可能看不到「鮑勃」。它可能實際上看到「愛麗絲」而不是「鮑勃」,它可能會看到「鮑勃」而不是「愛麗絲」。

+0

基本上,我問的是property.addListner(myListener),該線程偵聽器將運行於其上。這聽起來像監聽器將運行在FXThread(除非我失去了一些東西),這解決了我的問題。 –

+1

如果您自己沒有設置屬性,則可以安全地假定您的偵聽器將在fx線程上被調用。如果有疑問,你可以檢查你的聽衆,你是在FX線程。 – assylias