小白进来学线程通信

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循环的守护条件 就知道生产者如果已经走到唤醒那一步 说明条件是达到的 再次唤醒会判断条件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值