java -生产者和消费者模型

多线程的方式实现下面场景

场景

一个星期有7天 工人每天往客户家里放入1瓶牛奶,工人需要判断奶箱子的里面是否存在牛奶,里面存在牛奶不能放入第2瓶子,顾客需要每天取出牛奶,以便工人能放进去

创建一个奶箱类

package com.itxs.demo08;

/**
 * @Classname : Box
 * @Description : TODO 奶箱类
 * @Author : [email protected]
 */
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 : [email protected]
 */
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 : [email protected]
 */
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 : [email protected]
 */
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();
    }
}

你可能感兴趣的:(常用API,-,03,java,开发语言)