什么是等待唤醒机制这是多个线程间的一种协作机制。谈到线程我们经常想到的是线程间的竞争(race),比如去争夺锁,但这并不是故事的全部,线程间也会有协作机制。就好比在公司里你和你的同事们,你们可能存在在晋升时的竞争,但更多时候你们更多是一起合作以完成某些任务。就是在一个线程进行了规定操作后,就进入等待状态(wait()), 等待其他线程执行完他们的指定代码过后 再将其唤醒(notify());在有多个线程进行等待时, 如果需要,可以使用 notifyAll()来唤醒所有的等待线程。wait/notify 就是线程间的一种协作机制。
Object中定义了三个和等待唤醒有关的三个方法:
* wait() 调用后会释放锁对象,让当前线程陷入等待,直到有其他线程将其唤醒
* notify() 唤醒其他正在等待的一个线程,先等待的先被唤醒
* notifyAll() 唤醒全部正在等待的线程
使用前提:1. 同步中 2. 用锁对象调用这些方法
如果采用定义Lock锁对象的方式,就不能使用Object中的沉睡与唤醒方法,需使用其子类ReentrantLock中的newCondition方法.
newCondition会返回一个用来与此 Lock 实例一起使用的 Condition 实例。
Condition中有await(),signal()和signalAll方法,用来替代Object中的wait(),notify(),notifyAll()方法.
使用前提:1.同一个Lock锁对象2.同一个newCondition对象(达到指定唤醒,即同一个newCondition对象中的await()方法只能用本对象的signal()方法或 signalAll方法唤醒).
|
|