美文网首页
线程的wait和notify方法

线程的wait和notify方法

作者: 一直在路上_求名 | 来源:发表于2020-05-27 02:37 被阅读0次

    方法简介

    wait 方法

    wait() 方法是 Object 类的一个方法,因此 Java 中所有的类都默认继承了该方法,因此都能使用该方法,但是这个方法不可以被子类重写,该方法是一个 final 方法,子类不能重写,只能使用 Object 的实现,这个方法本身是一个 native 方法。

    notify 方法

    notify() 方法也是一个 Object 类的方法,所有 Java 类也都默认继承了该方法,都可以调用该方法,这个方法也是被 final 修饰的,因此也不可被子类重写,也是一个 nativ e的方法。

    方法的使用及作用

    wait 方法

    1、wait() 方法在调用时当前线程必须要先获得该 wait() 方法所在对象的监视器锁,如果没有获取对象的监视器锁,直接调用 wait() 方法会抛出 IllegalMonitorStateException 异常。而所谓的获取对象的监视器锁,说白了就是在使用 wait() 方法时,必须要在 synchronized 的同步代码块类,他们必须要成对出现;

    2、当某个线程调用了线程间某个共享变量的 wait() 方法时,该调用的线程会释放掉它获取到的锁,让给其他线程去竞争,然后当前线程会被阻塞挂起,此时线程的状态为 WAITING 状态;

    3、当有其他线程调用该共享变量的 notify() 方法或者 notifyAll() 方法时,当前被阻塞挂起的线程就可能被唤醒,然后再去竞争锁,进行相印的操作;当其他线程调用该线程的 interrupt() 方法时,该线程会抛出 InterruptedException 异常,该线程也会正常返回;

    4、还有一个需要注意的,虽然调用 wait() 方法会释放锁,但是它只会释放当前共享对象的锁,如果当前线程还有其他对象的锁,则不会被释放。

    notify 方法

    1、notify() 方法和 wait() 方法类似,都是需要先获取当前线程的共享对象监视器,如果没有也会抛出 IllegalMonitorStateException 异常。

    2 、当某个线程的 notify() 方法被执行时,会在正等待的队列中取一个被阻塞的线程后,去唤醒这个线程,被唤醒的线程需要重新和其他的线程去竞争锁,它获取到该共享对象的锁时,才能正常返回;

    3、notify 会唤醒被阻塞到该共享变量上的一个线程,而 notifyAll() 则会唤醒所有在该共享变量上被wait 挂起的线程。

    总结

    1、wait() 方法和 notify() 方法都是 Object 类的方法,而且都不允许被重写;

    2、wait() 方法和 notify() 方法都需要获取到当前线程的共享的对象监视器才能使用,不然会报 IllegalMonitorStateException 异常;也就是必须和 synchronized 同时出现;

    3、wait() 方法会释放当前线程在该共享变量上的锁,当前线程将被阻塞挂起;

    4、notify() 唤醒被阻塞的线程时,该线程不能立刻执行,需要和其他线程竞争,获取到对象的监视器锁时,才能执行;

    相关文章

      网友评论

          本文标题:线程的wait和notify方法

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