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时间)则需要被其他线程中断后才能退出阻塞。
  • 相关阅读:
    金融系列10《发卡行脚本》
    金融系列9《发卡行认证》
    金融系列8《应用密文产生》
    ED/EP系列5《消费指令》
    ED/EP系列4《圈存指令》
    ED/EP系列2《文件结构》
    ED/EP系列1《简介》
    社保系列11《ATR》
    社保系列3《文件结构》
    社保系列2《文件系统》
  • 原文地址:https://www.cnblogs.com/Mr-GG/p/wait-henotify.html
Copyright © 2011-2022 走看看