★模式的基本概念
生产者 :产生数据的模块
消费者 :消费(接收和处理)数据的模块
缓冲区 :介于生产者和消费者之间,生产者把数据放入缓冲区,消费者从缓冲区中取出数据
倒垃圾
1.生产垃圾(生产者生产数据)
2.下楼把垃圾放在垃圾桶里 (将数据放入缓冲区)
3.环卫工人来处理垃圾桶 (消费者接收数据)
4.垃圾装车并处理 (消费者处理数据)
那么这个模式有什么好处呢,为什么不把垃圾直接给环卫工人呢
优1
就是解耦和,两者之间不直接依赖,都依赖于缓冲区
优2
支持并发操作
上述例子,你垃圾不扔垃圾桶,你直接给环卫工人,工人一天处理那么多垃圾,挨家挨户的处理,你就得等着,等他来处理你的垃圾。
如果你把垃圾扔垃圾桶,你们两个是独立的并发主体,你把垃圾往垃圾桶里这么一扔,你就可以接着去生产垃圾了,根本不依赖环卫工人的处理速度。
优3
支持忙闲不均
如果你生产垃圾的速度太快,环卫工人来不及处理,这时候垃圾桶就有用了,可以先把垃圾放垃圾桶里,等环卫工人处理
数据单元
放到垃圾桶里的垃圾,就是数据单元,有以下几个特性:
1.完整性 :垃圾得放在垃圾袋装好,都整漏了,人家还怎么处理
2.独立性 :垃圾分类要做好,垃圾互相独立,不一样的垃圾不能装一个袋
3.颗粒性 :处理垃圾的时候,环卫工人怎么处理是个问题,他怎么装包,是一包装一袋垃圾还是一包装10袋垃圾,颗粒太大会造成某种浪费,太小会影响性能问题
具体实现
https://blog.csdn.net/u010339647/article/details/52013123
可以参考一下这个博客的设计思路,用的多线程方式,他的方法二缺少一个Main函数,我给补上
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Object object = new Object();
ArrayList<Integer> list = new ArrayList<Integer>();
MyService ms=new MyService();
ProduceThread[] pt = new ProduceThread[2];
ConsumeThread[] ct = new ConsumeThread[2];
for(int i=0;i<2;i++){
pt[i] = new ProduceThread(ms);
pt[i].setName("生产者 "+(i+1));
ct[i] = new ConsumeThread(ms);
ct[i].setName("消费者"+(i+1));
pt[i].start();
ct[i].start();
}
}
}