测试类
package com.test_thread;
/**
* @author 李胜坤
* @version 1.0
* @date 2020/12/7 16:02
*/
public class Main {
public static void main(String[] args) {
//生产者消费者模型
/*
* 生产一次后,拿完再生产
* */
Object lock = new Object();
Box box = new Box(0,false);
Producer producer = new Producer(box,lock);
Customer customer = new Customer(box,lock);
new Thread(producer).start();
new Thread(customer).start();
}
}
生产者
package com.test_thread;
/**
* @author 李胜坤
* @version 1.0
* @date 2020/12/7 20:58
*/
public class Producer implements Runnable {
private Box box;
private Object lock;
public Producer(Box box, Object lock) {
this.box = box;
this.lock = lock;
}
@Override
public void run() {
//生产步骤
synchronized (lock) {
for (int i = 1; i < 5; i++) {
//如果有牛奶,就暂停生产线程代码,等待消费线程
if (box.getMilkFlag()) {
try {
/* wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有bai该锁的对象用,
其它对象用完后再告知(notify)等待的那个对象可以继续执行了,因此,只有在synchronized块中才有意义*/
lock.wait();//暂停执行本线程下面代码
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没有奶,执行下列生产牛奶代码
box.setCurrentMilk(i);
System.out.println("*************************");
System.out.println("送奶工: 送来了"+box.getCurrentMilk()+"瓶牛奶");
//修改奶箱状态
box.setMilkFlag(true);
//生产完毕,唤醒消费线程
lock.notifyAll();
}
}
}
}
消费者
package com.test_thread;
/**
* @author 李胜坤
* @version 1.0
* @date 2020/12/7 20:58
*/
public class Customer implements Runnable{
private Box box;
private Object lock;
public Customer(Box box,Object lock) {
this.box = box;
this.lock = lock;
}
@Override
public void run() {
//消费步骤
synchronized (lock){
while(true){ //一直消费
//如果没有牛奶就暂停执行消费代码
if (!box.getMilkFlag()){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//有牛奶,执行下列消费代码
//消费一瓶牛奶,牛奶数减一
box.setCurrentMilk(box.getCurrentMilk()-1);
System.out.println("客户: 拿走了1瓶牛奶");
System.out.println(" 奶箱: 还剩"+box.getCurrentMilk()+"瓶牛奶");
//如果牛奶数等于0,修改奶箱状态
if(box.getCurrentMilk()==0){
box.setMilkFlag(false);
//唤醒生产线程
lock.notifyAll();
}
}
}
}
}
共享数据区
package com.test_thread;
/**
* @author 李胜坤
* @version 1.0
* @date 2020/12/7 20:58
*/
public class Box {
private int currentMilk;
private boolean milkFlag;
public Box() {
}
public Box(int currentMilk, boolean milkFlag) {
this.currentMilk = currentMilk;
this.milkFlag = milkFlag;
}
public int getCurrentMilk() {
return currentMilk;
}
public void setCurrentMilk(int currentMilk) {
this.currentMilk = currentMilk;
}
public boolean getMilkFlag() {
return milkFlag;
}
public void setMilkFlag(boolean milkFlag) {
this.milkFlag = milkFlag;
}
}