如果没有调用notify(),等待的线程会发生什么?

7
如果没有调用notify(),等待线程会发生什么?这算是虚假唤醒吗?

线程是在没有通知的情况下被唤醒了吗? - Aniket Thakur
是的,我已经调用了等待函数,但是没有编写通知代码。 - amitguptageek
虚假唤醒非常罕见且不太可能发生。你是否正在使用notifyAll() - Aniket Thakur
2
如果您想知道带有wait()的特定代码发生了什么,您应该发布该代码。虚假唤醒很少见,如果您再次运行程序,则不太可能重复出现。因此,如果您可以重现此问题,则可能不是虚假唤醒。 - RealSkeptic
如果您正在使用wait()的重载方法,那么该线程可以被唤醒。除此之外,这是一个罕见的情况! - Prashant
1个回答

11

如果一个等待Thread没有在其所等待的对象上调用notify()notifyAll()方法进行通知,那么以下任何一种情况都可能发生:

  • Thread将继续在对象的等待池中等待。
  • Thread会变得可运行,如果指定了超时时间并且已经超过了该时间。
  • Thread中断,然后再次变为可运行状态。
  • Thread由于没有任何原因而醒来,即既没有收到通知也没有被中断

最后一种情况被称为虚假唤醒,这是在唤醒线程后,线程应始终检查它正在等待的条件是否成立的原因之一。如果不成立,则Thread应再次调用wait()方法并继续等待。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接