等待通知机制
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方法会一直持有对象锁,并不会进行释放