生产者消费者案例

该文介绍了一个使用Java实现的生产者消费者问题的经典案例。通过Box类作为共享数据区域,Producer类作为生产者线程生产数据并放入Box,Customer类作为消费者线程从Box获取并消费数据。Box类使用synchronized关键字和wait/notifyAll方法确保线程间的同步和通信。
摘要由CSDN通过智能技术生成

实质:

        该案例模式是一个十分经典的多线程协作模式,所谓生产者消费者问题,实际上主要包含了两类线程:

  • 生产者线程(生产数据)
  • 消费者线程(消费数据)

        通过共享数据区域间接将两者联系起来,生产者将生产的数据直接放在共享数据区域,消费者从共享数据区域中获取数据,彼此之间并不关心对方的行为。

分析:

  • 奶箱类(Box):定义一个成员变量(表示第x瓶奶),提供set()(存储牛奶)和get()(获取牛奶)的方法。
  • 生产者类(Producer):实现Runnable接口,重写run()方法,在方法中调用存储牛奶的操作。
  • 消费者类(Customer):实现Runnable接口,重写run()方法,在方法中调用获取牛奶的操作。
  • 测试类(BoxDemo):创建奶箱对象(共享数据区域)、创建生产者对象和消费者,把奶箱对象作为构造方法参数传递、创建两个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递、启动线程。
    奶箱类(Box)
    package Thread;
    
    public class Box {
        private int milk;
        private boolean state = false;
    
        public synchronized void put(int milk) {
    //        如果有牛奶,等待
            if (state) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            this.milk = milk;
            System.out.println("送奶工的第" + this.milk + "瓶奶。");
            state = true;
            notifyAll();
        }
    
        public synchronized void get() {
    //        如果没有牛奶
            if (!state) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("消费者的第" + this.milk + "瓶奶。");
            state = false;
            notifyAll();
        }
    }
    

    生产者类(Producer)

    package Thread;
    
    public class Producer implements Runnable{
        private Box b;
        public Producer(Box b){
            this.b = b;
        }
        @Override
        public void run() {
            for (int i = 0;i<5;i++){
                b.put(i);
            }
        }
    }

    消费者类(Customer)

    public class Customer implements Runnable {
        private Box b;
    
        public Customer(Box b) {
            this.b = b;
        }
    
        @Override
        public void run() {
            while (true) {
                b.get();
            }
        }
    }

    测试类(BoxDemo)

package Thread;

public class BoxDemo {
    public static void main(String[] args) {
        Box b = new Box();
        Producer p = new Producer(b);
        Customer c = new Customer(b);

        Thread t1 = new Thread(p);
        Thread t2 = new Thread(c);

        t1.start();
        t2.start();
    }
}

运行结果: 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值