生产者消费者模型,其实就是一个(生产者)负责产生数据,另一个(消费者)负责使用数据,这里的数据就是生产者和消费者共用的资源,为了让生产者和消费者能有序地使用公共资源,需要引入锁(synchronized)的概念----在一段代码中,将那一段需要很多线程共同使用的代码(相当于共享资源)用synchronized关键字定义,相当于给这一段区域进行了加锁,当有线程来操作它时,就会对其加锁,其他的线程在此时若准备操作它只能排队等待,等第一个线程操作完成,锁解除之后,才能操作。
下面实现的生产消费模型主要是:
1.仓库中无产品时,生产者开始生产一件放入仓库,通知消费者来取;
2.消费者从仓库中取出产品后,仓库没有库存,通知生产者去继续生产。
3.生产者和消费者是两个互不干扰的线程,但是又有一定的联系,联系就是通过仓库这个被锁定的区域实现的。
4.wait()和notify()方法就是生产者和消费者线程之间的联系,当一方在使用公共资源时,另一方的状态为wait,当这一方使用公共资源完毕后,会notify(通知)等待的一方。
产品类:
public class Banana {
//香蕉类
private String name="香蕉";
private int id;
public Banana(String name,int id){
this.id=id;
this.name=name;
}
public String toString(){
return "第"+id+"个"+name;
}
}
生产者类:
import java.util.LinkedList;
public class Tproducer extends Thread {
// 生产者类
private LinkedList<Banana> buffer;
public Tproducer(LinkedList<Banana> buffer) {
this.buffer = buffer;
}
public void run() {
int id = 0;
// 如果这个队列里面有没有香蕉的话就要去生产一个香蕉
while (true) {
try {
synchronized (buffer) {
if (buffer.size() == 0) {
Banana ba = new Banana("香蕉", id);
buffer.add(ba);
id++;
System.out.println("生产了" + ba.toString());
buffer.notify();
} else
buffer.wait();
// Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消费者类:import java.util.LinkedList;
public class Tcustomer extends Thread {
//消费者类
private LinkedList<Banana> buffer;
public Tcustomer(LinkedList<Banana> buffer){
this.buffer=buffer;
}
public void run(){
while(true){
try{
synchronized(buffer){
if (buffer.size() > 0) {
Banana ba=buffer.remove(0);
System.out.println("消费了"+ba.toString());
buffer.notify();
}
else{
buffer.wait();
}
}
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
主函数:
import java.util.LinkedList;
public class Manager {
public static void main(String[] args){
LinkedList<Banana> buffer=new LinkedList();
Tproducer tp=new Tproducer(buffer);
Tcustomer tc=new Tcustomer(buffer);
tp.start();
tc.start();
}
}
运行的结果如下:
谈谈我的看法:通过打印会发现生产者线程和消费者线程会按照顺序依次对LinkedList进行操作,对比两段线程的代码,会发现,当生产者里面没有香蕉的时候就会自动的生产香蕉然后通过notify()方法提醒消费者,如果没有那么久会调用wait()方法等待生产,同样消费者在消费的时候也是如此。此时只允许一个线程对该链表队列进行操作。