浅谈生产与消费模型

  生产者消费者模型,其实就是一个(生产者)负责产生数据,另一个(消费者)负责使用数据,这里的数据就是生产者和消费者共用的资源,为了让生产者和消费者能有序地使用公共资源,需要引入锁(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()方法等待生产同样消费者在消费的时候也是如此。此时只允许一个线程对该链表队列进行操作。

  

 

 
 

猜你喜欢

转载自jiongsca.iteye.com/blog/2199634
今日推荐