2017-07-09 79 views
0

如何暫停一個線程,直到一個條件變爲true而不需要等待? 例如,假設我檢查,看看你如何暫停一個線程,直到一個條件成真而不需要等待?

playerOne.isWalking()

是否會是真的,我想運行一些代碼,當它成爲現實。再次假設playerOne是類Player的一個實例,然後它具有函數isWalking()。我無法訪問使isWalking()成爲現實的原因。因此,每次我想檢查isWalking()是否爲true時,我都必須明確地從播放器實例調用該方法。

我試過在同步塊中使用Wait/Notify,但那樣做永遠不會工作,因爲我將不得不手動通知線程以喚醒isWalking()變爲true時,我不知道它何時會變成真正。

我試過使用觀察者模式使Player成爲observable的一個子類,這樣我可以在isWalking()變爲true時調用更新方法,但我不知道何時會發生。

我甚至嘗試過使用Propertys,但那也行不通。

這甚至可以檢查沒有忙等待嗎?不斷輪詢並調用該函數以查看它是否爲真,那麼如果它是真的,則執行代碼。

這是一個糟糕的解決辦法,我提出涉及忙等待:

Busy-Waiting solution

+0

歡迎來到Stack Overflow!請參考[遊覽](http://stackoverflow.com/tour),環顧四周,閱讀[幫助中心](http://stackoverflow.com/help),特別是[我該如何問一個好問題?](http://stackoverflow.com/help/how-to-ask)和[我可以問什麼問題?](http://stackoverflow.com/help/on-topic)。 –

回答

0

墊層的問題是,您使用的getter方法向AQUIRE在其上的信息,並採取行動。這裏違反的原則是告訴別問!

解決此問題的OO可以引入接口(例如:PlayerMovingListener)。

玩家類將持有實現該接口(或其列表)的對象的實例。只要玩家開始行走,它就會調用由玩家持有的(或全部)偵聽器對象實現的接口中定義的isMoving()方法。
最有可能是由當前的Payer實現中的setter方法觸發的。

+0

我很欣賞這個快速響應。如果在我當前使用的API的Player當前實現中有一個,我無法訪問任何setter。 isInCombat(){/ *已編譯的代碼* /}' isInCombat()是我剛纔討論的isWalking()函數,爲了清晰起見而重命名。 那麼還有什麼選擇嗎? – TheAppFoundry

+0

*「我無法訪問任何setter,如果在我正在使用的API的Player的當前實現中有一個。」* - 您無法僅在一側實現偵聽器模式。'Player'類必須提供處理偵聽器的基礎結構。恕我直言,你的計劃是*由設計*打破。 –

+0

這是由設計打破。這回答了! – TheAppFoundry

相關問題