一、等待通知机制 相关方法
等待通知的相关方法是任意java对象都具备的,因为这些方法被定义在Object类中。
名称 | 描述 |
notify | 通知一个在对象上wait的线程,使其返回。返回的前提是该线程获得了对象的锁,即监视器monitor |
notifyAll | 通知所有等待的线程 |
wait | 调用该方法的线程进入等待状态,并且释放该对象的锁。只有接到notify通知或者被中断才会返回。 |
wait(long) | 设置了超时的时间,超时并且没有被通知也会自动返回 |
wait(long,int) | 更精细的超时设置 |
二、注意事项
1.使用wait,notify和notifyAll必需先对调用的对象加锁。即等待通知机制依赖于同步机制。先synchronize(对象),再调用 对象.wait()。
2.调用wait后,线程从运行状态进入等待状态,并将该线程放入对象的等待队列。
3.Notify后,等待线程不会立即返回,而是需要调用notify的线程释放锁之后,等待线程才有机会返回。
4.Notify方法将等待队列的一个等待线程从等待队列移到同步队列中,而notifyAll则是全部都移到同步队列中。
三、具体过程
waitThread为蓝色线,NotifyThread为红色线
WaitThread首先获取了对象的锁,然后调用对象的wait方法,从而放弃锁进入等待队列。随后NotifyThread获得锁资源,并调用notify方法唤醒WaitThread,使他从等待队列移到同步队列进行锁的竞争。当NotifyThread释放锁后,WaitThread就可以获得锁并从wait方法中返回并继续执行。
四、经典范式
等待方:1.获取对象的锁
2.如果条件不满足,则等待,被通知后仍要检查
3.条件满足则从等待返回,并继续
Synchronize(对象){
While(条件不满足){
对象.wait();
}
条件满足时的逻辑;
}
通知方:1.获得对象锁
2.改变条件
3.通知所有等待在对象上的线程
Synchronize(对象){
改变条件
对象.notifyAll();
}
出处: http://blog.csdn.net/parallelyk/article/details/51685464
参考资料:java并发编程艺术