wait notify的正确使用
在开始之前,我们先看看Sleep和wait的区别和共同点
1、sleep是thread的方法,而wait是Object的方法
2、sleep是不需要强制和synchronized使用,而wait需要强制和synchronized使用
3、sleep在睡眠的通时,不会释放锁对象,但wait在等待的 时候会释放锁对象
4、sleep和wait的线程状态一致,都是有时限等待:TIMED_WAITNG
下面看一段代码
public static Object lock = new Object;
public volatile int i = 0;
//这是第一个线程 t1
synchronized(lock){
while(i!=1){//需要用到条件不成立
lock.wait();
}
}
//下面可能 有 t2 t3 等等别的任务线程
//这是第n个线程 tn
synchronized(lock){
//唤醒等待中的线程
i= 1;
lock.notifyAll();
}
这段代码的意思很清晰,如果有多个线程执行,但是每个线程需要一个条件才能执行,否则就没法往下进行,这时候我们可以用while进行循环判断,因为有可能t2 线程需要i=2的时候才能执行,而notify是随机唤醒一个,如果使用notify把t2唤醒了,发现 i=1 ,这就造成了资源浪费,所以建议采用notifyAll把所有线程唤醒,然后条件成立的继续执行,不成立的则进入下一轮的等待