线程之生产者消费者案例-送奶

package Mymodifier.testcode.src.Thread; public class SendMilkDemo { public static void main(String[] strings) { /* 生产者消费者案例: 1.奶箱类(Box):定义一个成员变量,表示第x瓶奶,提供存储和获取牛奶的操作 2.生产者(Producer):实现Runnable接口,重写run()方法,调用存储牛奶的操作 3.消费者(Customer):实现Runnable接口,重写run()方法,调用存储牛奶的操作 4.测试类(SendMilkDemo):里面有main方法,main方法中的代码步骤如下: a.创建奶箱对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 b.创建生产者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 c.创建消费者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 d.创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递 */ //创建奶箱对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Box b = new Box(); //创建生产者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Producer p = new Producer(b); //创建消费者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Comsumer c = new Comsumer(b); //创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递 Thread p2 = new Thread(p,"生产者"); Thread c2 = new Thread(c,"消费者"); //启动线程 p2.start(); c2.start(); } }

奶箱类:

package Mymodifier.testcode.src.Thread;

public class Box
{
    //定义一个成员变量,表示第x瓶奶
    private int milk;
    //创建牛奶状态(默认为false)
    private boolean state = false;

    //存储牛奶数量(加了同步关键字才能使用wait(等待)和notify/All(唤醒))
    public synchronized void put(int milk) {
        //如果牛奶状态为true
        if(state)
        {
            //则进入等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        this.milk = milk;
        //如果有牛奶,就消费牛奶
        System.out.println("送奶工将第" + this.milk + "瓶放入奶箱");
        //牛奶状态设置为true
        state = true;
        //唤醒全部等待线程
        notifyAll();
    }

    //获取牛奶数量
    public synchronized void get() {
        //如果牛奶状态为false
        if (!state)
        {
            //则进入等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果没有牛奶,就生产牛奶
        System.out.println("用户拿到第" + this.milk + "瓶奶");
        //牛奶状态设置为true
        state = false;
        //唤醒全部等待线程
        notifyAll();
    }


}

生产者类(送奶工):

package Mymodifier.testcode.src.Thread;

public class Producer implements Runnable
{

    private Box b;

    public Producer(Box b)
    {
        this.b = b;
    }
    @Override
    public void run() {
        for(int i = 1; i < 6; i++)
        {
            b.put(i);
        }
    }
}

消费者类:

package Mymodifier.testcode.src.Thread;

public class Comsumer implements Runnable {
    private Box b;

    public Comsumer(Box b)
    {
        this.b = b;
    }

    @Override
    public void run()
    {
        while(true)
        {
            b.get();
        }
    }
}
经验分享 程序员 微信小程序 职场和发展