【问题标题】:What Wait() Actually means in Java ? I will Wait or You Wait?Wait() 在 Java 中的实际含义是什么?我会等还是你等?
【发布时间】:2014-09-25 06:05:48
【问题描述】:

据我了解,如果我是线程,那么:

  • 当我调用 notify()/notifyAll() 这意味着我正在向其他线程发送信号 正在等待此对象监视器。我说的对吗?

  • 但是wait() 是什么意思?

    我是否正在向其他线程发送信号等待以便我可以完成我的工作?
    或者
    我声明我会等待,你完成你的工作并告诉我你什么时候完成。?

我对线程有一点概念

【问题讨论】:

  • 你正在等待一些人通知你一些事情......
  • 花点时间阅读Lesson: Concurrency,不要害怕尝试一些测试...
  • 后者。但这可以在有关此主题的任何文档中阅读,包括 API doc about wait() 本身。
  • 声明 wait() 的线程将等待。当您通知他时,它将恢复执行。
  • 我认为这是一个很好的问题——因为这是一个非常非常古老的方法,而wait 的表达不是那么清楚!! Thread.waitForNotificaion() 肯定是一个更好的方法名

标签: java multithreading wait notify


【解决方案1】:

不,这意味着想要等待通知。

根据Java docs(我的重点):

导致当前线程等待,直到另一个线程调用this对象的notify()方法或notifyAll()方法。

【讨论】:

  • 那我有点困惑。假设有人在一个对象上调用 notify,而我没有等待那个特定的对象监视器,但我正在处理那个对象。这是一个有效的情况吗?如果是,那么它会受到行为的影响吗?
  • 如果你愿意,我可以用这部分更新我的问题。
  • 两个线程需要使用相同的监视器对象才能工作。如果有人在不相关的对象上调用notify,您将继续等待。
  • 我得到了这部分谢谢。但是我只是想像所有其他新手一样想知道我是否不等待某个对象而是将其用作属性或某些东西以及在该对象上称为通知的其他线程?这种情况会发生还是逻辑上不可能?如果是,那么它会影响我吗。@Thilo
  • @Saif,您需要查看通知文档 - 他们声明“如果有任何线程正在等待此对象,则选择其中一个被唤醒。”因此,如果没有线程在等待,则无法唤醒任何线程。这就是为什么服务员在尝试等待之前应该检查他们的状况,以防在没有人等待的情况下发出通知。
【解决方案2】:

意思是“我宣布我会等待,你完成你的工作,完成后告诉我。”

文件说,

使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。换句话说,此方法的行为与它只是执行调用 wait(0) 完全相同。 当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

See this link

【讨论】:

  • wait() 没有声明任何东西。它只是等待。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2013-05-06
  • 2021-10-07
  • 2013-01-04
  • 2015-02-21
  • 2011-10-29
  • 2016-10-27
相关资源
最近更新 更多