天天看點

單生産者-----------單消費者

父親生産蘋果,女兒消費蘋果,當盤子中沒有蘋果的時候父親生産,女兒隻能等待,當盤子中有蘋果的還是父親等待女兒消費

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