java多线程生产者消费者例子

java多线程一章里面举了一个很经典的例子,它就是生产者和消费者的例子,比如说有一个篮子,里面能放6个饼,有厨师生产饼子,顾客吃饼子,厨师生产一个就往篮子里面放,放满的话,线程暂停,提醒顾客快吃;顾客一次吃一个饼子,如果篮子空了,线程也暂停,提醒厨师继续生产。
ProducerConsumer.java的源代码如下


package com.daozhao.java.thread;

public class ProducerConsumer {
	public static void main(String[] args){
		Basket b=new Basket();
		Producer p=new Producer(b);
		Consumer c=new Consumer(b);
		new Thread(p).start();
		new Thread(c).start();
	}
}

class WoTou{
	int id;
	WoTou(int id){
		this.id=id;
	}
	public String toString(){
		return "WoTou:" + id;
	}
}

class Basket{
	int index=0;
	WoTou[] arrWT=new WoTou[6];
	
	public synchronized void push(WoTou wt){
		while(index == arrWT.length){
			try{
				this.wait();
			}catch(InterruptedException i){
				i.printStackTrace();
			}
		}
		this.notify();
		arrWT[index]=wt;
		index++;
	}
	
	public synchronized WoTou pop(){
		while(index==0){
			try{
				this.wait();
			}catch(InterruptedException i){
				i.printStackTrace();
			}
		}
		this.notify();
		index--;
		return arrWT[index];
	}
}

class Producer implements Runnable{
	Basket b=null;
	Producer(Basket b){
		this.b=b;
	}
	
	public void run(){
		for(int i=0;i<20;i++){
			WoTou wt=new WoTou(i);
			b.push(wt);
			i++;
			System.out.println("生产了"+ wt);
			try{
				Thread.sleep(2000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable{
	Basket b=null;
	Consumer(Basket b){
		this.b=b;
	}
	
	public void run(){
		for(int i=0;i<20;i++){
			WoTou wt=b.pop();
			System.out.println("消费了" + wt);
			try{
				Thread.sleep(1000);
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注