通过送奶工人(生产者)将牛奶放入奶箱(容器),提醒用户(消费者)取奶和开启等待和唤醒等待的业务行为演示生产者和消费者的逻辑关系,
运行入口:
package yield;
/**
* demo
*/
public class Demo {
public static void main(String[] args) {
//创建奶箱对象,这是共享数据区域
Box box = new Box();
//创建生产者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作
Producer producer = new Producer(box);
//创建消费者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用获取牛奶的操作
Customer customer = new Customer(box);
//创建线程对象,分别把生产者和消费者对象作为构造方法参数传递
Thread t1 = new Thread(producer);//生产者线程
Thread t2 = new Thread(customer);//消费者线程
//启动线程
t1.start();
t2.start();
}
}
奶箱(容器):
package yield;
/**
* 奶箱(容器)
*/
public class Box {
//奶瓶数量
private int milk;
//奶箱状态(默认情况下是没有牛奶的)
private boolean state = false;
/**
* 存储牛奶的动作
*
* @param milk 奶瓶
*/
public synchronized void put(int milk) {
//奶箱中还有牛奶(等待消费)
if (state){
//wait() 等待消费
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果没有牛奶,就放入牛奶(生产牛奶)
this.milk = milk;
System.out.println("送奶工将第 " + this.milk + " 放入奶箱");
//放入完毕,修改状态
this.state = true;
//放入后提醒消费者取奶(唤醒消费者)
this.notifyAll();
}
/**
* 拿出牛奶动作
*/
public synchronized void get() {
//奶箱中没有牛奶,等待放入牛奶(等待生产)
if (!state){
//等待生产
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果有牛奶,就拿出牛奶
System.out.println("用户拿到第 " + this.milk + " 瓶奶");
//拿出完毕后,修改状态
this.state = false;
//拿出牛奶后,提醒生产者继续放牛奶(唤醒生产者)
this.notifyAll();
}
}
送奶工人(生产者):
package yield;
/**
* 送奶工人(生产者)
*/
public class Producer implements Runnable {
private Box box;
public Producer(Box box) {
this.box = box;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++){
this.box.put(i);//放入牛奶
}
}
}
用户(消费者):
package yield;
/**
* 牛奶订购者(消费者)
*/
public class Customer implements Runnable{
private Box box;
public Customer(Box box) {
this.box = box;
}
@Override
public void run() {
while (true){
box.get();//获取牛奶
}
}
}