前言
生产者消费者模式属于一种经典的多线程协作的模式,弄清生产者消费者问题能够让我们对于多线程编程有更深刻的理解,下面,为大家分享一个生产者消费者的案例。
一、案例描述
这里以快递为例,假设有一个快递柜,用来存快递,然后有快递员和取件人,快递员往快递柜里存快递,取件人从快递柜中取走快递。快递员作为生产者,取件人作为消费者,当两者在一个时间段同时进行多次自己的操作时,很明显这就是多线程编程的生产者消费者实例了。在这里,我们希望快递员(生产者)存入一个快递,取件人(消费者)就拿走一个快递,如果快递还没有被取走,那么生产者应该等待,而如果快递柜里没有快递,则消费者应该等待。
首先来明确一下,这个案例我们需要准备:
- 快递柜类(Box):包含一个成员变量,表示快递的序号,并提供存快递和取快递的操作方法
- 生产者类(Producer):实现Runnable接口,包含存快递的方法
- 消费者类(Customer):实现Runnable接口,包含取快递的方法
- 测试类(BoxDemo):测试类按如下步骤实现这个案例
(1) 创建快递柜对象作为共享数据区域
(2) 创建生产者,把快递柜对象作为参数传递至构造方法,因为生产者需要完成存快递的操作
(3)创建消费者,把快递柜作为对象传递至构造方法,因为消费者需要完成取快递的操作
(4)创建两个线程,将生产者和消费者对象分别作为参数传递至线程的构造方法,然后启动线程
下面是具体实现:
二、创建快递柜
代码如下:
public class Box {
//定义成员变量表示第几个快递(快递序号)
private int express;
//定义一个成员变量用于表示快递柜的状态
private boolean flag = false;
//存快递
public synchronized void put(int express) {
//如果有快递,那么快递员应该等待取件人来取快递
if (flag) {
try {
wait();
} catch (InterruptedException e)