天天看点

单生产者-----------单消费者

父亲生产苹果,女儿消费苹果,当盘子中没有苹果的时候父亲生产,女儿只能等待,当盘子中有苹果的还是父亲等待女儿消费

package com.cc.day16;

public class Demo01 {

	public static void main(String[] args) {
		Apple a = new Apple();
		Producer pro = new Producer(a);
		Consumer con = new Consumer(a);
		Thread pro_t = new Thread(pro,"父亲");
		Thread con_t = new Thread(con,"女儿");
		pro_t.start();
		con_t.start();
	}

}
//定义一个类,描述消费的产品
class Apple{
	//定义公共的变量
	public String name;
	public int count = 1;
	//flag主要作为wait和notify的判断标记
	public boolean flag = false;
}
//生产者
class Producer implements Runnable{
	//声明一个Apple类型
	private Apple a ;
	Producer(Apple a){
		this.a = a;
	}
	//定义生产的名字
	public void produce(String name) {
		a.name = name+a.count;
		a.count++;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			synchronized(Apple.class) {//锁对象可以是任意的对象,只要保证生产者和消费者以及wait和notify的锁对象一致即可
				if(a.flag) {//a.flag==true,代表盘子里有苹果,不可以生产,需要等待
					try {
						Apple.class.wait();//wait()前面不加锁对象就会出现异常//java.lang.IllegalMonitorStateException
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				produce("苹果");//一定得记得生产,不生产女儿吃什么,不生产的话,名字就全部为null
				System.out.println(Thread.currentThread().getName()+"削好了"+a.name);
				try {//我也不晓得为啥必须要休息,不然苹果数就不是从1开始,可能是消费者消费需要时间,???
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				a.flag=true;//改变标志
				Apple.class.notify();//唤醒生产者
			}
		}
	}
	
}
class Consumer implements Runnable{
	Apple a;
	Consumer(Apple a){
		this.a = a;
	}
	//定义消费的方法,返回苹果的名字
	public String consume() {
		return a.name;
	}
	@Override
	public void run() {
		while(true) {
			synchronized (Apple.class) {
				if(!a.flag) {
					try {
						Apple.class.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				System.out.println(Thread.currentThread().getName()+"拿走了"+consume());
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				a.flag=false;
				Apple.class.notify();
			}
		}
	}
	
}
           

【运行结果】

父亲生产苹果1

女儿消费了苹果1

父亲生产苹果2

女儿消费了苹果2

父亲生产苹果3

女儿消费了苹果3

父亲生产苹果4

女儿消费了苹果4

父亲生产苹果5

女儿消费了苹果5

父亲生产苹果6

女儿消费了苹果6

父亲生产苹果7

女儿消费了苹果7