实现生产者消费者模式
无论是面试还是工作中,生产者和消费者模式一直是一个比较常见的问题,今天,我们用各种方式来实现它。
前言
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。
一、wait/notify/notifyAll实现
有一个天猫小店专门负责生产商品,用户也可以去买商品:
一个生产者的线程:
同理,一个消费者的线程:
下面进行测试:
此时的结果为:
由于生产大于消费,造成产能过剩。
二、阻塞队列实现
这个的实现已经在JUC组件拓展-BlockingQueue中实现了。不再赘述。主要就是用到阻塞的put()
和take()
两个方法。
三、condition+Lock实现
这个也很简单,就是基于wait
和notify
的代码稍微改一下即可。
生产者改为:
消费者跟生产者一样的改法:
执行效果类似。关于Condition
接口,在Condition详解这篇文章中进行了详细介绍。
其实还有一些其他的方式也可以实现生产者消费者模型,但是我觉得最核心的就是上面讲的三种,掌握这个就不慌了。