当前位置: 首页 > news >正文

阻塞队列/生产者消费者问题

刚开始了解阻塞队列的时候对这段叙述产生疑惑,为什么队列为空,出队列也要阻塞呢?

场景:两个厨师卖烧饼,两个顾客买烧饼,有一个烧饼摊。

在多线程的情况下会出现并发安全问题,污染数据。

此时我们不再将焦点放在顾客和厨师,而是烧饼摊,让烧饼摊自己去控制处理访问的顺序,而不是我们去处理顾客和厨师。将烧饼摊看成一个固定长度的队列(queue),假设长度为10,可以存最多10个烧饼

烧饼摊只需要分别告诉厨师和顾客四种情况:

1.告诉厨师烧饼摊(队列)已经满了,不能再放了

2.告诉厨师烧饼摊(队列)有空位置,可以放入了

3.告诉顾客烧饼摊(队列)没有烧饼,先等待一会

4.告诉顾客烧饼摊(队列)有烧饼了,可以来买了

阻塞队列(blockingQueue)

场景变更1:当烧饼摊(队列)一直没有烧饼,路人甲不可能一直等待,想让他等待10秒钟,如果超过10秒,就放弃等待。

解决方法:使用poll()方法,里面传入两个参数:时间,单位

问题再现:如果超过一段时间没有获取到烧饼,系统会返回一个null,因此我们需要进行校验,如果超过等待时间没有烧饼,给出返回值而不是null

场景变更2:如果路人甲一来到烧饼摊马上就要买,没有就离开,该如何实现

解决方法:直接调用poll()方法并且不传入值

从阻塞队列中获取元素有三个方法:

take(死等)

poll(带参数)(等一段时间)

poll(不带参数,不等)

从阻塞队列中存放元素的三个方法:

put()

offer(E,long,TimeUnit)  返回值是Boolean类型,如果队列没有空位就进行等待一段时间,超过时间如果有空位就返回true,队列仍满,返回false。

offer(E) 返回值也是Boolean

总结并回答:

回到刚开始的疑惑我已经明白,如果队列为空,出队列需要阻塞,这里的意思是,队列为空-->队列中没有资源,出队列需要阻塞-->想从队列中拿到资源,需要阻塞等待,而不是一开始以为的,要从一个没人的通道穿过,既然通道为空,就不需要等待的情况(完全考虑错了)。


http://www.mrgr.cn/news/61169.html

相关文章:

  • 边缘图片渲染API-开箱即用的动态图片生成方案,轻松实现分享海报图片生成
  • 关联分析中的前因和后果怎么理解
  • 使用Vision Transformer进行图像分类
  • Vue.js(2) 入门指南:从基础知识到核心功能
  • 【动态三维重建】MonST3R:运动中的几何估计
  • 【专题】2024中国B2B市场营销现况白皮书报告汇总PDF洞察(附原数据表)
  • DevEco Studio的使用 习题答案<HarmonyOS第一课>
  • 【射频器件】QPM1017 QPM2102 QPC1031D QPC7333 QPC7339 QM45398 QM14068- Qorvo特点、及应用
  • RTT工具学习
  • signal() -函数的详细使用说明
  • 树莓集团:以数字化平台为基,构建智慧园区生态体系
  • UI设计软件全景:13款工具助力创意实现
  • Spring Boot 经典九设计模式全览
  • AI绘画:SD3.5来了,Flux又不行了?
  • 【JAVA】第四张_Eclipse创建Maven项目
  • 【PUCCH——Format和资源集】
  • SpringBoot 定时任务 @Scheduled 详细解析
  • CentOS7安装Docker-2024
  • 软考信息系统监理师 高分必背
  • 3. 无重复字符的最长子串