多线程生产者,消费者例题

   生产者、消费者问题

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

如果生产者生产了过多的产品,店员会叫生产者等一下,如果店中有空位放产品了在通知生产者继续生产;如果店中没有了产品,店员会告诉消费者等一下,如果店中有产品了再通知消费者取走产品。

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

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

  

//生产者线程要执行的任务
public class Producer implements Runnable {
	private Clerk cl;
	public Producer(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.addProduct();//生产产品
		}
	}
	
	
}
//消费者线程要执行的任务
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 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 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();
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章