生产者消费者模式并不是JAVA23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式,生产者消费者模式便是其中之一,它是我们编程过程中最常用的一种设计模式
在我们平时的开发场景中,例如某个线程是生产数据,另一个线程是处理数据,如果俩者的速度存在较大的差异,生产数据很快,处理数据很慢,那么每生产一笔数据之后都要等待数据处理完才能再次生产,则会造成资源的浪费;再或者生产数据的时候出问题了甚至会中断整个流程。但是如果引入一个缓冲区概念用到生产者消费者模式就不一样了。生产的数据直接放到缓冲区里,缓冲区满之后则不再生产,处理数据的时候直接从缓冲区里面拿数据。这样做的好处有如下:
解耦,就像生产者消费者俩个齿轮本来直接连接,现在引入第三个齿轮放入他们之间,他们分别与这个齿轮连接,就算将来生产或者消费者出问题也不至于整个轮子都挂掉。
支持忙闲不均,当生产者消费者俩者速度存在差异的时候,由于存在缓冲区,多生产的数据可以放在缓冲区里面等消费者慢慢来处理。例如现在的快递柜的存在,假设平常快递柜快递员可以一次拿走,但当双11的时候,快递柜爆满,则可以先放在柜子里面,等快递员分批消化。
支持并发,防止程序阻塞,例如生产数据必须在消费者消费完后再生产效率低下。就像邮局寄信一样如果没有邮筒你寄信就只能等邮递员来取,万一路上堵车呢你就傻傻的等在那里。造成时间的浪费。
好了废话不多说,直接撸代码,上文提到了缓冲区首先创建一个Box类当作缓冲区
1 | /** |
接下来创建生产者类
1 | public class Producer extends Thread{ |
消费者类
1 | public class Consumer implements Runnable { |
测试类以及结果
1 | public class Test { |