等待通知机制

等待通知机制

notify, notifyAll, wait

这三个方法构成了java的等待通知机制的核心,它们主要是用于线程间通信时使用. 使用这三个方法的前提是当前线程必须拥有对象的锁

  • wait: 当前线程进入等待状态,直到其它线程调用了对象的notify或者notifyAll方法
  • notify:随机选取一个正在等待的线程唤醒
  • notifyAll:将全部等待的线程唤醒

使用

notify, notifyAll和wait方法在使用时,必须获取到相应对象的锁才能使用,否则会抛出IllegalMonitorStateException异常. 在执行完wait操作后,当前执行线程会释放对象的锁,以等待其它线程调用该对象的notify或者notifyAll方法

wait与sleep的区别

  • 在使用wait的时候, 线程必须拥有这个对象的锁,也就是说,wait方法调用必须出现在synchronize块中,类似地,notify/notifyAll也有这样的限制. sleep方法不需要出现在synchronize块中
  • wait/nofity/nofityAll方法是在对象上进行调用,而sleep方法是在线程对象上进行调用
  • 在调用wait方法后,线程会释放持有的该对象锁(但不会释放其它锁),而sleep方法会一直持有对象锁,并不会进行释放

与Condition对象的区别

参考文献

  1. http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep
您的支持将鼓励我继续创作!