一、生产者消费者模式
这是一种不属于GOF23的设计者模式
这种模式分为三个对象:一个生产者,一个消费者,一个缓存区。
- 生产者
某些程序/进程/线程负责生产数据就属于生产者
- 消费者
某些程序/进程/线程负责使用数据就属于消费者
假设在生产者和消费者之间没有一个缓存区,那么会出现什么情况呢?
- 耦合性高,生产者和消费者联系紧密,不利于系统的扩展和维护
- 并发性能低,同时能处理请求量少
- 忙闲不均,生产者和消费者的速度不一致,带来系统资源的浪费
那么如果有一个缓存区,那么两者之间的依赖性就大大降低,也就是解耦。同时生产者也可以生产多个资源放到缓存区,消费者也可以从缓存区多次得到资源,提高并发性能。阻塞队列可以很好的解决忙闲不均的问题。
阻塞队列
能够根据数据满或空的情况,自动对线程执行等待和通知
BlockingQueue 接口
-
put 添加数据,达到上限会自动让线程等待
-
take 取并删除数据,数据空了会自动让线程等待
实现类
ArrayBlockingQueue 类 数据结构为数组
LinkedBlockingQueue类 链表结构
我们这里举一个简单的例子解释一下这个模式:
比方说,早上我们都要去买包子吃早饭,那么包子师傅就是生产者,顾客就是消费者,蒸笼就是缓存区。大家都知道,蒸笼是可以由包子师傅自己决定有多少个,因此缓存区的最大值就可以自己进行设置。包子师傅(生产者)可以一次做多个包子(资源)放到蒸笼(缓存区)里,当有顾客(消费者)来购买包子(拿资源)就是从蒸笼里面拿取包子。蒸笼满了,包子师傅就不会做包子了,顾客也会来