0

忙しく待たずに条件が成立するまでスレッドを一時停止するにはどうすればよいですか?例えば は、忙しく待たずに条件が成立するまでスレッドを一時停止するにはどうすればよいですか?

playerOne.isWalkingは()

真になるだろうと私はそれが真実になってないときにいくつかのコードを実行するかどうか、私が見てチェックしていたとします。もう一度、playerOneがPlayerクラスのインスタンスであり、関数isWalking()を持っているとします。私はisWalking()を真にするものにアクセスできません。したがって、isWalking()がtrueであるかどうかを確認するたびに、プレーヤのインスタンスからメソッドを明示的に呼び出す必要があります。

同期ブロックでWait/Notifyを使用しようとしましたが、isWalking()がtrueになったときにスレッドを手動で起動して、いつになるのかわからないため動作しませんでした本当。

私は、isWalking()がtrueになったときにupdateメソッドを呼び出すことができるように、Observerパターンを使用してPlayerをobservableのサブクラスにしようとしましたが、いつ再び発生するのかわかりません。

私はさらにPropertiesysを使ってみましたが、どちらもうまくいかないでしょう。

忙しい待たずにチェックすることも可能ですか?その関数が常に真であるかどうかを調べるためにその関数をポーリングして呼び出し、それが真であればコードを実行します。下層の問題は、あなたがそれについての情報や行動をAQUIREするゲッターメソッドを使用することである

Busy-Waiting solution

+0

ようこそスタックオーバーフロー! [ツアー](http://stackoverflow.com/tour)を見て回り、[ヘルプセンター](http://stackoverflow.com/help)、特に[どのように私に質問しますか良い質問?](http://stackoverflow.com/help/how-to-ask)と[ここで私はどのような話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)。 –

答えて

0

これは私が忙しい待機を伴う作っ悪い溶液でした。ここで違反されている原則はです。

これを解決するための方法は、のインターフェイス(例:PlayerMovingListener)を導入することです。

プレーヤクラスは、そのインタフェース(またはそのリスト)を実装するオブジェクトのインスタンスを保持します。プレーヤーが歩くとすぐに、プレーヤーが保持する(またはすべての)リスナーオブジェクトによって実装されたインターフェイスで定義されたisMoving()メソッドが呼び出されます。
ほとんどの場合、現在のPayer実装のセッターメソッドによってトリガーされます。

+0

私は使用しているAPIからのPlayerの現在の実装に1つがあった場合、どのレスポンスにもアクセスできません。 'public boolean isInCombat(){/ *コンパイルされたコード* /}' isInCombat()は私が話していたisWalking()関数で、わかりやすくするために名前を変更しました。 残っているオプションはありますか? – TheAppFoundry

+0

*「私が使用しているAPIからPlayerの現在の実装に1つがあった場合、セッターにアクセスすることはできません」* - リスナーパターンは片側のみに実装することはできません。'Player'クラスは、リスナーを処理するためのインフラストラクチャを提供する必要があります。 IMHOあなたのプログラムは*設計によって壊れています*。 –

+0

デザインによって壊れています。それはそれに答える! – TheAppFoundry

関連する問題