当前位置: 首页 > 面试题库 >

为什么总是在循环内调用wait()

田曜瑞
2023-03-14
问题内容

我读过,我们应该始终wait()在循环内调用a :

while (!condition) { obj.wait(); }

它可以正常工作而没有循环,那为什么呢?


问题答案:

你不仅需要循环它,还需要在循环中检查条件。Java不能保证仅通过notify()/ notifyAll()调用或正确的notify()/ notifyAll()调用来唤醒你的线程。由于此属性,无环版本可能在你的开发环境上工作,而在生产环境上意外失败。

例如,你正在等待一些东西:

synchronized (theObjectYouAreWaitingOn) {
   while (!carryOn) {
      theObjectYouAreWaitingOn.wait();
   }
}

邪恶的线程出现了:

theObjectYouAreWaitingOn.notifyAll();

如果邪恶线程没有/不能使carryOn你混乱,你只需继续等待适当的客户端。

编辑:添加了更多示例。等待可以中断。它抛出InterruptedException,你可能需要将等待包装在try-catch中。根据你的业务需求,你可以退出或取消该异常并继续等待。



 类似资料:
  • 问题内容: 我一直在使用“ if”来测试自己的版本,并且一切似乎都正常。当然,如果使用signalAll()而不是signal(),这将导致严重崩溃,但是如果一次仅通知一个线程,这怎么会出错? 他们的代码在这里 -检查put()和take()方法;在Condition的JavaDoc顶部可以看到一个更简单,更重点的实现。 下面是我实施的相关部分。 PS我知道,通常,尤其是在这样的lib类中,应该让

  • 问题内容: 我只是想简化我的一个类,并以与flyweight设计模式相同的样式介绍了一些功能。 但是,对于为什么总是调用after ,我有点困惑。我没想到这一点。谁能告诉我为什么会这样,否则我如何实现此功能?(除了将实现放入hack之外)。 这是一个例子: 输出: 为什么? 问题答案: 使用 时,你需要控制一个新实例的创建。 使用 时,你需要一个新的实例的控件初始化。 是实例创建的第一步。首先调用

  • 本文向大家介绍为什么在__new __()之后总是调用__init __()?,包括了为什么在__new __()之后总是调用__init __()?的使用技巧和注意事项,需要的朋友参考一下 Python具有一种称为魔术方法的特殊类型的方法,该方法以前置和双下划线命名。 如果我们想谈论魔术方法__new__,那么显然也需要谈论__init__方法。创建实例时将调用魔术方法__new__。而在创建实

  • 问题内容: 我正在通过“ A Go of Go”教程。 我想检查一下这个问题的答案: 注意:对方法内部的调用将使程序陷入无限循环。您可以通过先转换来避免这种情况 。为什么? 我相信这是因为调用该函数时,由于错误为非nil,将再次调用the ,依此类推,从而导致无限循环。 问题答案: 将调用将值转换为。如果该方法调用,则程序将递归直到内存不足。 您可以通过将转换为不带or 方法的值来中断递归。

  • 问题内容: 我只是想简化我的一个类,并以与flyweight设计模式相同的样式介绍了一些功能。 但是,对于为什么总是被称为after ,我有点困惑。我没想到这一点。谁能告诉我为什么会这样,否则我如何实现此功能?(除了将实现放到中之外)。 这是一个例子: 输出: 为什么? 问题答案: 使用时,你需要控制一个新实例的创建。 使用 时,你需要一个新的实例的控件初始化。 是实例创建的第一步。首先调用它,它

  • 我正在用Java开发一个俄罗斯方块克隆,在我想要清除整行并删除上面的所有内容之前,一切似乎都正常工作。虽然我所有的数据都正确地表示了转换,但我的paintComponent方法似乎只清除了行,但上面显示的所有内容都保持在repaint()调用之前的状态。新的碎片将穿过幻影积木,落在最下面一排的隐形积木上,上面的碎片会落在那里。 这是我的油漆成分方法: 这是计时器侦听器中actionPerforme