wait notify的生产者创建者模式,在具体场景中怎么使用 如何创建类 并调用。需要下面这三个类
- 管道类 (包含
两个方法
一个给生产者线程用 一个给消费者线程用 类中一定会有一个变量像flag
一样 给这两个方法用来判断 作为守护模式的守护条件 ) - 生产者线程类
- 消费者线程类
其实和正常的线程创建很像 只不过将目标类称为管道类 线程调用者被区分成两种线程类而已
在学习生产者消费者模式之前先来学守护模式 简单来说就是只有一个wait 一个notify 单方面的唤醒
注意wait和notify操作的是一个锁对象的等待队列
当notify时 从队列里出来 等待重新获得锁
当Wait时进入等待队列
守护模式
public sycnchronized get(){
while(!ready){ 守护条件
wait();
}
dosth();
}
public sychronized put(){
read=true; 改变守护条件
notifyAll();
}
不要以为只要调用notify 就一定会立刻从等待队列里出来
-
每次被notify 都会重新检查守护条件
如果守护条件不成立 还是会一直循环等待
即使notify也不会将Wait改变
-
由于put是一个原子性操作 所以一定要等整个函数全执行完 才会唤醒等待队列的线程 如果把
notifyAll()改成放在上面 也不会线程不安全
因为要将put原子函数全部执行完 才生效
public sychronized put(){
notifyAll();
read=true; 改变守护条件
}
生产者消费者多线程模式
当中我常常疑惑 如果两边都notify wait 大家都维护一个等待队列 会不会生产者把生产者的对象唤醒了
其实如果理解了上面的每一次唤醒还要取检查while循环的守护条件 就知道生产者如果已经走到唤醒那一步 说明条件是达到的 再次唤醒会判断条件