父親生産蘋果,女兒消費蘋果,當盤子中沒有蘋果的時候父親生産,女兒隻能等待,當盤子中有蘋果的還是父親等待女兒消費
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