public class Clerk {	private int product=0;//产品默认0;	//生产者生成出来的产品交给店员	public synchronized void addProduct(){		if(this.product>=20){			try {				wait();//产品已满,请稍等在生产			} catch (InterruptedException e) {				// TODO 自动生成的 catch 块				e.printStackTrace();			}		}else{			product++;			System.out.println("生产者生产地"+product+"个产品。");			notifyAll(); //通知等待区的消费者今天取产品了		}	}		//消费者从店员处取产品	public synchronized void getProduct(){		if(this.product<=0){			try {				wait();//产品没有货了,请稍等再取			} catch (InterruptedException e) {				// TODO 自动生成的 catch 块				e.printStackTrace();			}		}else{			System.out.println("消费者取走了第"+product+"个产品");			product--;			notifyAll();//通知等待区的生成者可以生产 产品		}	}}//消费者线程要执行的任务public class Consumer implements Runnable {	private Clerk cl;  public Consumer(Clerk cl) {		this.cl=cl;	}    	public void run() {		System.out.println("消费者开始取走产品!");		while(true){			try {				Thread.sleep((int)(Math.random()*10)*100);			} catch (InterruptedException e) {				// TODO 自动生成的 catch 块				e.printStackTrace();			}			cl.getProduct();//取走产品		}	}}

/*

 * 生产者、消费者问题

 * 

 * 生产者讲产品交给电源,而消费者从店员出去走产品,店员一次只能持有固定数量的产品,

 * 如果生产者生产了过多的产品,店员会叫生产者等一下,如果店中有空位放产品了在通知生产者继续生产;

 * 如果店中没有了产品,店员会告诉消费者等一下,如果店中有产品了再通知消费者取走产品。

 * 问题:

 * 生产者比消费者快是,消费者会漏掉一些数据没有取到

 * 消费者比生产者快时,消费者会取相同的数据

 *

 */

public class Demo {

}

public class Main {

public static void main(String[] args) {

// TODO 自动生成的方法存根

Clerk cl=new Clerk();

Thread prt=new Thread(new Producer(cl));//生产者线程

Thread cot=new Thread(new Consumer(cl));//消费者线程

prt.start();

cot.start();

}

}