生产消费者模型(蓝杰)
生产消费者模型是描述生产者生产消费者消费的模型,这是多线程的运用。在这个模型中至少有一个生产者一个消费者,也就是说至少有两个线程。我们这里写的是最基本的两线程模型。
接下来介绍代码,我们写的代码主要有四个类,其中主干是生产者(producter)类和消费者(customer)类,另外加一个程序入口(manage)类和(Data)数据类。
package 生产消费者;
import java.util.List;
public class producter implements Runnable{
private List<Data> listData;//定义私有列表对象,用来存储数据对象
public producter(List<Data> listData) {
this.listData=listData;
}//通过构造器传入列表对象,因为生产者和消费者都只用同一个仓库,这个仓库在主函数中定义并且分别传入生产者和消费者类内部。
public void run() {
while(true) {
//用锁使线程同步
synchronized(listData) {
if(listData.size()<10) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
listData.add(new Data());
System.out.println(Thread.currentThread().getName()+":生产产品,剩余产品数量"+listData.size());
listData.notify();//通过notify()方法唤醒线程
}else {
System.out.println("仓库已满!!!");
try {
listData.wait();//仓库容量达到最大值,生产者线程进入沉睡。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
package 生产消费者;
import java.util.List;
public class customer implements Runnable{
private List<Data> listData;
public customer(List<Data> listData) {
this.listData=listData;
}
public void run() {
while(true) {
synchronized(listData) {
if(listData.size()>0) {
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
listData.remove(0);
System.out.println(Thread.currentThread().getName()+":消费产品,剩余产品数量"+listData.size());
listData.notify();
}else {
System.out.println("库存为0!!!");
try {
listData.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
package 生产消费者;
public class Data {
}
package 生产消费者;
import java.util.ArrayList;
import java.util.List;
public class manage {
public static void main(String[] args) {
List<Data> listData=new ArrayList<Data>();
producter p=new producter(listData);
customer c=new customer(listData);
new Thread(p,"生产者").start();
new Thread(c,"消费者").start();
}
}
因为线程之间的运行顺序会不时交替,所以不一定生产者生产满消费者才生产。因为有线程同步代码块(synchronized)不会出现生产者只生产一半就被消费者抢去运行内存的情况(对消费者也是一样)。
如果不用线程锁,会出现"current thread is not owner"错误,因为在生产者刚生产到一半使用权便被消费者抢去。