zoukankan      html  css  js  c++  java
  • wait和notify

    • wait方法时可中断方法,这也就意味着,当前线程一旦调用了wait方法进入阻塞状态,其他线程时可以使用interrupt方法将其打断的;可以中断方法被打断后会收到中断异常InterruptedException,同时interrupt状态也会被擦除。
    • 线程执行了某个对象的wait方法以后,会加入与之对应的wait set中,每一个对象的monitor都有一个与之关联的wait set
    • 当线程进入wait set之后,notify方法可以将其唤醒,也就是从wait set弹出,同时中断wait中的线程也会被其唤醒。
    • 必须在同步方法中使用wait和notify方法,因为执行wait和notify的前提条件是必须持有同步方法的monitor的所有权,运行下面任何一个方法都会抛出非法的monitor状态异常IllegalMonitorStateException
    private void testWait() {
        try {
            this.wait();
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
    private void testNotify() {
        this.notify();
    }
    
    • 同步代码的monitor必须与执行wait notify方法的对象一致,简单地说就是用哪个对象的monitor进行同步,就只能用哪个对象进行wait和notify操作。

    wait和sleep区别

    • wait和sleep方法都可以使线程进入阻塞状态
    • wait和sleep方法均是可中断方法,被中断后都会收到中断异常。
    • wait和Object的方法,而sleep和Thread特有的方法。
    • wait方法的执行必须在同步方法中进行,而sleep则不需要
    • 线程在同步方法中执行sleep方法时,并不会释放monitor的锁,而wait方法则会释放monitor的锁
    • sleep方法短暂休眠之后会主动退出阻塞,而wait方法(没有指定wait时间)则需要被其他线程中断后才能退出阻塞。
  • 相关阅读:
    线程和信号
    线程取消状态和取消类型
    线程本地缓存
    线程安全函数的概念
    线程/同步对象的属性对象
    查看安全策略
    ss性能
    三次握手四次断开
    线程同步--屏障
    vs2008 编译时候 自动关闭 问题解决方法
  • 原文地址:https://www.cnblogs.com/Mr-GG/p/wait-henotify.html
Copyright © 2011-2022 走看看