如何在不忙等待的情况下暂停线程直到条件变为真?

How do you pause a thread until a condition becomes true without busy waiting?

如何在不忙等待的情况下暂停线程直到条件变为真? 例如,假设我正在检查是否

playerOne.isWalking()

会成真,我想 运行 一些代码当它成真时。再次假设 playerOne 是 class Player 的实例,然后具有函数 isWalking()。我无权访问使 isWalking() 变为真的原因。所以每次我想检查 isWalking() 是否为真时,我都必须显式地从播放器实例调用该方法。

我试过在同步块中使用 Wait/Notify 但这永远行不通,因为我必须手动通知线程在 isWalking() 变为真时唤醒,我不知道什么时候它会成为现实。

我已经尝试使用观察者模式使 Player 成为可观察对象的子class,这样我就可以在 isWalking() 变为 true 时调用更新方法,但我还是不知道什么时候会发生.

我什至尝试过使用 Propertys,但这也行不通。

这甚至可以在不忙等待的情况下进行检查吗?不断轮询和调用那个函数,看它是否为真,如果为真,则执行代码。

这是一个糟糕的解决方案,涉及忙等待:

Busy-Waiting solution

潜在的问题是您使用getter方法来获取信息并对其采取行动。这里违背的原则是说,不问!

解决这个问题的面向对象方法是引入一个接口(例如:PlayerMovingListener)。

玩家 class 将持有一个实现该接口(或接口列表)的对象实例。一旦玩家开始行走,它就会调用由玩家持有的(或所有)侦听器对象实现的接口中定义的 isMoving() 方法。
很可能是由您当前 Payer 实现中的 setter 方法触发的。