生产者消费者模型
原创
©著作权归作者所有:来自51CTO博客作者我是大头鸟的原创作品,请联系作者获取转载授权,否则将追究法律责任
今天是刚刚接触到生产者消费者模型,原来所谓 的生产者和消费者是指两个不同的模型,其中一个进程是用于生产数据,一个进程用于消费数据我们称为是消费者,当然在两者之间还要有一个数据存储的模型,用来存储生产者产生的数据,当然消费者也从这个数据存储模型中取出数据。
比如上面这个形象的图,就很好的描述了生产者消费者的关系,我们在下面通过一个程序来简单的描述生产者消费者这个模型:
package com.epoint.wdgtest;
public class WdgTest
{
//生产者消费者
public static void main(String [] args){
Data data=new Data();
new Thread(new DataProvider(data), "线程1").start();
new Thread(new DataConstumer(data), "线程2").start();
}
}
/*
* 数据存储类
*/
class Data{
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
/*
* 生产者
*/
class DataProvider implements Runnable{
private Data person;
public DataProvider(Data person) {
super();
this.person = person;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
if(i%2==0){
try {
Thread.sleep(50);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
person.setName("张三");
person.setAge(20);
}
else{
person.setName("李四");
person.setAge(18);
}
}
}
}
class DataConstumer implements Runnable{
private Data person;
public DataConstumer(Data person) {
super();
this.person = person;
}
public void setPerson(Data person) {
this.person = person;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("name"+person.getName());
System.out.println("age"+person.getAge());
}
}
在代码中我们创建两个进行一个是用于数据的产生一个是用于数据的消费,还有一个数据模型是用于数据的存储
但是数据的数据结果却是有问题的
可见数据并不是我们想的那样,这个是因为生产和消费并并没有同步,也就是我们在生产数据的过程中可能跟不上消费的节奏,但是程序可不一样,消费者可不管你生产的如何,还是要进行消费,于是就产生了上面输出的现象。如何解决上面的问题还是需要进行同步处理。下一节继续介绍,因为时间也不早了,明天再写吧。这一节就先认识一下什么是生产者和消费者。