父亲生产苹果,女儿消费苹果,当盘子中没有苹果的时候父亲生产,女儿只能等待,当盘子中有苹果的还是父亲等待女儿消费
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