美文网首页
等待和通知

等待和通知

作者: 希希里之海 | 来源:发表于2019-08-29 16:52 被阅读0次

等待和通知

API

java.lang.Object 类提供了一套等待/通知的 API,它由 3 个 wait()、一个 notify() 和一个 notifyAll() 方法组成。wait() 方法等待某个条件成立,当这个条件成立时,notify() 和 notifyAll() 方法通知处于等待中的线程。

  • void wait():导致当前线程一直处于等待,直到另外的线程调用这个对象的 notify() 或者 notifyAll() 方法,又或者一直等待其他的线程中断当前等待的线程。
  • void wait(long timeout):其他定义和 void wait() 一致,多了等待特定的毫秒数(由 timeout 确定)。当 timeout 是负数的时候,这个方法抛出 java.lang.IllegalArgumentException
  • void wait(long timeout, int nanos):其他定义和 void wait() 一致,多了等待特定的毫秒(由 timeout 确定)和纳秒数(由 nanos 确定)。当 timeout 是负数、nanos 是负数、或者 nanos 大于 999999 的时候,这个方法抛出 java.lang.IllegalArgumentException
  • void notify():唤醒正在等待该对象监听器的单条线程。如果有几条线程在该对象上等待,其中某一条会被挑选出来唤醒,这种选择是随意的且取决于具体实现。
  • void notifyAll():唤醒正在等待该对象监听器的全部线程。

注意:

  • 若当前线程开始或正在等待通知,任意线程中断了它,3 个 wait() 方法都会抛出 java.lang.InterruptedException
  • 绝对不要在循环外面调用 wait()notify()notifyAll() 方法。(防止出现 lost-wake-up 问题)
  • 在应用程序中,仅有两条线程并且某条线程偶尔等待、需要被另外一条线程通知的时候,才使用 notify() 方法,否则使用 notifyAll() 方法。
为什么 wait 方法定义在 Object 类里面,而不是 Thread 类?
  • 同步和等待是两个不同的领域,同步是提供互斥并确保 Java 类的线程安全的,wait 和 notify 是两个线程之间的通信机制
  • 保证每个对象都可上锁
为什么 wait 方法要放到同步块中?

为了避免使用者出现 "Lost-Wake-Up" 问题。

关于什么是 "Lost-Wait-Up" 问题,可以参考狼叔的博客:

https://www.jianshu.com/p/b8073a6ce1c0

总结如下

  • Java 强制我们的 wait() / notify() 调用必须要在一个同步块中,,就是不想让我们在不经意间出现这种 lost wake up问题。
  • 不仅仅是这两个方法,包括 java.util.concurrent.locks.Conditionawait() / signal() 也必须要在同步块中
  • Java 要求上述四个方法必须放在锁对象的代码块中,即使加锁,不是锁对象的代码块中同样也会报错,Java 这种检测机制非常严格。

如下述代码,加锁的是 obj 对象,notify 却是 anotherObj 对象使用,会抛出 IllegalMonitorStateException 异常。

private Object obj = new Object();

private Object anotherObj = new Object();

@Test
public void produce() {
    synchronized (obj) {
        try {
            anotherObj.notify();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • 等待和通知

    等待和通知 API java.lang.Object 类提供了一套等待/通知的 API,它由 3 个 wait()...

  • 四:线程等待和通知

    JDK提供了两个非常重要的接口线程等待 wait()方法和通知notify()方法。这两个方法是 Object类方...

  • 等待(wait)和通知(notify)

    为了支持多线程之间的协作,JDK提供了两个非常重要的接口线程等待wait()方法和通知notify()方法。这两个...

  • 任务等待和任务通知

    任务等待和任务通知 [TOC] Future Lifecycle 生命周期 Lifecycle是一个提供生命周期抽...

  • 等待通知

    高考过去一段时间了,现在身边一本的同学们已经知道学校。我还在等结果。报志愿那几天,真的,苦思冥想,自己翻来覆去,...

  • 等待通知

    江苏省480的总分,407就能上北大。只需要84.75% 加油,状元们。

  • 等待通知

    等待通知 文/严章强 在这个春花烂漫的季节里 本早该在学校上课的你们 因这场新冠病毒肺炎 影响了你们上学 封城防控...

  • 等待通知

    因为突发的疫情,原来通知的5月5日至10日居家办公,明天是否放开,能否正常去公司上班还是未知数。 从昨天的核酸检测...

  • 等待/通知机制

    等待/通知机制 场景 吃饭 : 一家人要吃午饭,妈妈做饭,我和爸爸吃饭。让我和爸爸的坐在桌子旁准备吃饭。但是我和爸...

  • Condition等待通知

    如果你知道经典的生产消费模式(wait,notify实现),那么这篇文章你应该能够轻松地阅读理解。Conditio...

网友评论

      本文标题:等待和通知

      本文链接:https://www.haomeiwen.com/subject/ngziectx.html