阻塞队列/生产者消费者问题
刚开始了解阻塞队列的时候对这段叙述产生疑惑,为什么队列为空,出队列也要阻塞呢?
场景:两个厨师卖烧饼,两个顾客买烧饼,有一个烧饼摊。
在多线程的情况下会出现并发安全问题,污染数据。
此时我们不再将焦点放在顾客和厨师,而是烧饼摊,让烧饼摊自己去控制处理访问的顺序,而不是我们去处理顾客和厨师。将烧饼摊看成一个固定长度的队列(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
总结并回答:
回到刚开始的疑惑我已经明白,如果队列为空,出队列需要阻塞,这里的意思是,队列为空-->队列中没有资源,出队列需要阻塞-->想从队列中拿到资源,需要阻塞等待,而不是一开始以为的,要从一个没人的通道穿过,既然通道为空,就不需要等待的情况(完全考虑错了)。