生产者消费者案例

本文通过一个快递柜的例子详细介绍了Java中生产者消费者模式的实现。内容包括创建快递柜类、生产者类、消费者类以及测试类。生产者存入快递,消费者取出快递,通过共享数据区域——快递柜进行协作。案例展示了如何使用synchronized关键字实现同步,确保线程安全。
摘要由CSDN通过智能技术生成


前言

生产者消费者模式属于一种经典的多线程协作的模式,弄清生产者消费者问题能够让我们对于多线程编程有更深刻的理解,下面,为大家分享一个生产者消费者的案例。


一、案例描述

这里以快递为例,假设有一个快递柜,用来存快递,然后有快递员和取件人,快递员往快递柜里存快递,取件人从快递柜中取走快递。快递员作为生产者,取件人作为消费者,当两者在一个时间段同时进行多次自己的操作时,很明显这就是多线程编程的生产者消费者实例了。在这里,我们希望快递员(生产者)存入一个快递,取件人(消费者)就拿走一个快递,如果快递还没有被取走,那么生产者应该等待,而如果快递柜里没有快递,则消费者应该等待。

首先来明确一下,这个案例我们需要准备:

  1. 快递柜类(Box):包含一个成员变量,表示快递的序号,并提供存快递和取快递的操作方法
  2. 生产者类(Producer):实现Runnable接口,包含存快递的方法
  3. 消费者类(Customer):实现Runnable接口,包含取快递的方法
  4. 测试类(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) 
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值