生产者消费者模型
- 1.为什么要使用生产者和消费者模式
- 2.案例
1.为什么要使用生产者和消费者模式
在线程开发中,生产者就是生产线程的线程,消费者就是消费线程的线程。在多线程开发中,如果生产者如理数据很快,消费者处理数据很慢,那么生产者必须等消费者处理完数据才能生产数据。如果消费者的处理能力大于生产者,那么消费者又必须等待生产者。为了解决这个问题,所以我们引入了生产者和消费者模型。
2.案例
就拿食品店来举个例子。我们要构造一家食品点,我们首先需要有食物。
/*** 食物类* @author 86184**/
public class Food {private String name;//全参构造public Food(String name) {this.name=name;}@Overridepublic String toString() {return "Food [name=" + name + "]";}}
其次,我们需要将这家食品店造出来,并且完善食品店的功能。比如贩卖食品。。。
/*** 商店的生产模式和消费模式·* @author 86184**/
public class KFC {private Deque<Food> q = new LinkedList<Food>();//缓存获取食物队列private final int MAX_SIZE =10;//商店的生产模式public synchronized void produce() {while(q.size()==MAX_SIZE) {System.out.println("队列已满,生产者休息等待消费者消费...");try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Food food = new Food("汉堡");q.offer(food);//添加到队列中System.out.println("生产者生产一个:"+ food+",还有食物: "+ q.size());notifyAll();}//商店的消费模式public synchronized void consume() {while(q.isEmpty()) {System.out.println("队列已空,消费者休息,等待生产者生产.....");try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Food food =q.poll();System.out.println("消费者消费一个:"+food+",还有食物:"+q.size());notifyAll();}}
3.既然商店和食品都已经准备完毕。我们就可以准备开业了。此时此刻,我们需要模拟雇佣厨师和顾客来购物时的情形了。
/*** 生产者的生产线程* @author 86184**/
public class ProducerThread extends Thread{private KFC kfc;public ProducerThread(KFC kfc) {this.kfc=kfc;}@Overridepublic void run() {while(true) {kfc.produce();try {sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
/*** 消费者线程* @author 86184**/
public class ConsumerThread extends Thread{private KFC kfc;ConsumerThread(KFC kfc) {this.kfc=kfc;}@Overridepublic void run() {while(true) {kfc.consume();try {sleep(400);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}
最后,让我们来测试一下
public class Test {public static void main(String[] args) {KFC kfc =new KFC();Thread t1 =new ProducerThread(kfc);Thread t2 =new ProducerThread(kfc);Thread t3 =new ProducerThread(kfc);Thread c1 = new ConsumerThread(kfc);Thread c2 = new ConsumerThread(kfc);Thread c3 = new ConsumerThread(kfc);Thread c4 = new ConsumerThread(kfc);Thread c5 = new ConsumerThread(kfc);t1.start();t2.start();t3.start();c1.start();c2.start();c3.start();c4.start();c5.start();}}