多线程的方式实现下面场景
场景
一个星期有7天 工人每天往客户家里放入1瓶牛奶,工人需要判断奶箱子的里面是否存在牛奶,里面存在牛奶不能放入第2瓶子,顾客需要每天取出牛奶,以便工人能放进去
创建一个奶箱类
package com.itxs.demo08;
/**
* @Classname : Box
* @Description : TODO 奶箱类
* @Author : lin_refuel@qq.com
*/
public class Box {
private int milk;// 牛奶的数量
private boolean emptyOrHave = false;//奶箱子的状态 true里面存在牛奶 false里面不存在牛奶
/**
* 奶箱子里面存放牛奶的方法
* @param milk 牛奶的数量
*/
public synchronized void into (int milk){
//放入牛奶时判断奶箱子的状态
if(emptyOrHave){
try {
wait(); // 如果奶箱子里面存放牛奶,进行等待
} catch (InterruptedException e) {
e.printStackTrace();
}
// 生产牛奶
this.milk = milk;
//放入牛奶
System.out.println("工人放入第"+this.milk+"瓶牛奶");
//修改奶箱子状态
this.emptyOrHave = true;
// 告诉客户牛奶放进下去
notifyAll();
}
}
/**
* 客户取走牛奶
*/
public synchronized void getMilk(){
//判断奶箱子里面是否存在牛奶
if(!emptyOrHave){
try {
wait();//当里面没有牛奶进行等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 正常取出牛奶
System.out.println("客户取走第"+this.milk+"瓶牛奶");
// 修改奶箱子里面的状态
this.emptyOrHave = false;
// 告诉工人牛奶被取走
notifyAll();
}
}
放入动作和取出动作
放入牛奶的线程
package com.itxs.demo08;
/**
* @Classname : produce
* @Description : TODO
* @Author : lin_refuel@qq.com
*/
public class produce implements Runnable{
//创建奶箱对象
Box box = new Box();
public produce(Box box) {
this.box = box;
}
@Override
public void run() {
// 一个星期七天 放入7瓶牛奶
for (int i = 1; i <=7 ; i++) {
this.box.into(i);
}
}
}
取出牛奶的线程
package com.itxs.demo08;
/**
* @Classname : take
* @Description : TODO
* @Author : lin_refuel@qq.com
*/
public class take implements Runnable{
// 创建奶箱子对象
Box box = new Box();
public take(Box box) {
this.box = box;
}
@Override
public void run() {
while(true) {
box.getMilk();
}
}
}
测试-实现上面场景
package com.itxs.demo08;
/**
* @Classname : test
* @Description : TODO 测试奶箱子
* @Author : lin_refuel@qq.com
*/
public class test {
public static void main(String[] args) {
Box box = new Box();// 创建奶箱对象
// 创建工人线程
Thread worker = new Thread(new produce(box));
// 创建客户线程
Thread client = new Thread(new take(box));
// 开启两个线程
worker.start();
client.start();
}
}