java 生产者消费者_Java 多线程实现生产者和消费者模式

374ad0452277b1c9017ec819ee52a9e5.png

一、生产者和消费者模式描述

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者从空间里取走数据。

存在的问题:
  • 当生产者比消费者快时,消费者会漏掉一部分数据;
  • 当消费者比生产者快时,消费者会取走相同的数据。
解决方案(考虑到线程安全问题,解决此问题有三种方式):
  1. 同步代码块
  2. 同步方法
  3. lock 锁机制, 通过创建 Lock 对象,采用 lock() 加锁,unlock() 解锁,来保护指定的代码块
注:本文章我们采用第二种方式解决了线程安全问题

二、wait() 和 notify() 方法

  • wait():当缓冲区已满 / 空时,生产者或消费者线程停止自己的执行,释放锁,使自己处于等待状态,让其它线程执行。

3dd2d6c42430aa90d2f7c24714b74e6c.png
  • notify():当生产者或消费者向缓冲区放入或取出一个产品时,向其他等待的线程发出通知,同时释放锁,使自己处于等待状态,让其它线程执行。

34a2bbbda30c8a3aa248d261ad6acb8c.png
wait()nofity() 这两个方法必须有锁对象调用,而任意对象都可以作为 synchronized 的同步锁,因此这两个方法只能在 Object 类中声明 。

三、生产者和消费者模式代码实现

商店类(Shop):定义一个成员变量,表示第几个面包,提供生产面包和消费面包的操作;
public 
生产者类(Producer):实现 Runnable 接口,重写 run() 方法,调用生产面包的操作;
public 
消费者类(Consumer):实现 Runnable 接口,重写 run() 方法,调用消费面包的操作;
public 
测试类:测试消费者和生产者模式
public 
运行结果:

ff1a9eb01386fd45d83f1d5bd7fcf06f.gif
知乎视频​www.zhihu.com

希望能够帮到大家,有问题的可以留言讨论哦!

768a9ebb04a24abcb7d34733521681f6.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值