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时间)则需要被其他线程中断后才能退出阻塞。
posted @ 2020-04-09 23:28  newbie94  阅读(665)  评论(0编辑  收藏  举报