------昨天理解的生产者和消费者模式,今天写一下我对这个模式的想法,然后我利用这个模式写了一个 读取文件的小程序。
------介绍:生产者和消费者模式,它不是一种设计模式,而是一种解决由多线程引发的同步问题的办法,也称为有限缓冲问题
------有一块固定容量的缓存区,有多个线程同时访问或操作这个块缓存区,而此时,一个线程称为生产者,生成数据到这块缓存,另一个线程消费者从这个块缓存里读取数据,这个过程就可能引发一系列线程安全问题。
------而解决问题的关键就是,使消费者和生产者同时只能有一个线程访问这块缓存,也就是说它们之间是互斥的。
------方法:当生产者生成数据的时候,消费者休眠,当缓存区满时,生产者停止生产,陷入休眠,而此时消费者就从休眠状态醒来,从缓存里取出数据
------实现此方法的一个思路就是使用信号灯法,设置一个标识,当标识为真的时候,消费者消费,生产者等待。当标识为假的时候,生产者生产,消费者等待.
------我贴一下我理解这个模式之后写小程序,这个程序的缓存区其实就是一个byte数组,然后它的生产者就是读取流,读取流生产的行为,就是读取数据到缓存区,直到缓存区满,再通知消费者消费。而消费者是输出流,输出流的消费行为就是从缓存区取出数据到并输出到控制台。而每次消费者消费都是将缓存区里的数据全部拿出来,所以每次读取的时候都需要将缓存区置为空。
------可以从上面我对这个程序的介绍里看出,生产者和消费者其实是没有任何关系的,它们只负责和缓存区交互,所以降低了两个模块的耦合性。
代码: Buffer 类(缓存区)
public class Buffer {
// 读取数据的缓存区
private volatile byte[] bytes = new byte[1024];
//信号灯法 判断该线程生产还是消费
private boolean flag = false;
// 读取的字节数,因为这里的生产行为是读取文件的数据,所以每次读取的 时候,都从上次读取的位置开始
p