实现生产者消费者进程(Java)

2023-05-16

目录

前言 

一、实验要求

二、步骤

1.主类

2.消费者

 3.生产者

4.超市


前言 

消费者问题是操作系统中典型的进程同步互斥问题,(英语:Producer-Consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个进程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程“生产者”(Producer)和“消费者”(Consumer)在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。问题的约束条件是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中为空时消耗数据。


一、实验要求

  1. 互斥信号量和资源信号量的使用
  2. 互斥信号量初始值为1来表示(同步于操作系统书),同步信号量用0表示(本文没有涉及到)。
  3. 最大存放空间为10。
  4. 消费者不可以在没有产品的时候进行消费。
  5. 消费者和生产者是两个线程
  6. 生产和消费这两个线程执行时,生产者或者消费者不会一直执行相应的方法。(是穿插着来的)

二、步骤

1.主类

代码如下(示例):

  • 实例化俩个实现Runnable接口的对象


import com.os.util.Consumer;
import com.os.util.Producer;
import com.os.util.Supermarket;

/**
 * 主类
 */
public class Main {
    public static void main(String[] args) {
        Supermarket supermarket = new Supermarket();
        Consumer consumer = new Consumer(supermarket);
        Producer producer = new Producer(supermarket);
        Thread
                t1 = new Thread(consumer,"消费者"),
                t2 = new Thread(producer,"生产者");
        t1.start();
        t2.start();
    }
}

2.消费者

代码如下(示例):

  • 死循环执行消费方法


/**
 * 消费者
 */
public class Consumer implements Runnable{
    private Supermarket supermarket;

    public Consumer(Supermarket supermarket) {
        this.supermarket = supermarket;
    }

    @Override
    public void run() {
        while (true) {
            supermarket.consume();
        }
    }
}

 3.生产者

代码如下(示例):

  • 死循环执行生产方法
/**
 *生产者
 */
public class Producer implements Runnable{
    private Supermarket supermarket;

    public Producer(Supermarket supermarket) {
        this.supermarket = supermarket;
    }

    @Override
    public void run() {
        while (true) {
            supermarket.product();
        }
    }
}

4.超市


/**
 * 互斥信号量
 * 1:生产者正在执行此时消费者等待,生产者执行完毕之后,消费者再去执行。
 * 0:消费者正在执行此时生产者等待,消费者执行完毕之后,生产者再去执行。
 *
 * wait()和 notify()是一对互斥锁 相对于wait()和signal()
 * wait()是进行等待,当前线程处在阻塞状态
 * notify()是唤醒线程
 */  

 

代码如下(示例):

public class Supermarket {

    private static int mutex = 1;  //互斥信号量
    private static final int max = 10;  //可放最大空间
    private  int count; //统计产品数量

    public synchronized void product() {
        if (mutex == 0 && this.count >= max) {
            try {
                this.wait();//线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }//互斥信号量为0 且生产的数量小于超市可放的最大数量()
        else {
            count++;//生产产品
            System.out.println(Thread.currentThread().getName() + "生产 +1,剩余:" + count);
            this.notify();//唤醒线程
            mutex = 0;//消费者进行消费
            try {
                Thread.sleep(500);//避免当前线程再次进入该方法,执行线程等待半秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized void consume() {
        if (this.count == 0 && mutex==1) {
            try {
                this.wait();//线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //mutex=0且 count !=0
        } else {
            count--;//消费产品
            System.out.println(Thread.currentThread().getName() + "消费 -1,剩余:" + count);
            this.notify();//唤醒线程
            mutex = 1;
            try {
                Thread.sleep(500);//避免当前线程再次进入该方法,执行线程等待半秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 三、运行结果

  • 可能每次的运行结果不用,但是都满足实验要求。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现生产者消费者进程(Java) 的相关文章

随机推荐

  • agt-get install过程中发现依赖Depends错误的解决办法

    ubuntu在sudo apt get install g 43 43 时报错 xff1a Reading package lists Done Building dependency tree Reading state informat
  • windows自带的压缩/解压缩(zip/unzip)功能-Powershell 的应用之一

    压缩文件经常碰到 xff0c 一般可以下载免费的unzip软件 xff0c 但是要么很多广告 xff0c 要么用一段时间就要购买 其实windows自动的Powershell 就可以做压缩和解压的 Powershell 是微软用于计算机管理
  • 服务器应用与安全—— OpenEuler欧拉

    OpenEuler源于华为EulerOS操作系统 xff0c 通过社区合作 xff0c 打造创新平台 xff0c 构建支持多处理架构 统一和开放的操作系统 xff0c 推动软硬件应用生态繁荣发展 最新版 xff1a OpenEuler 21
  • 什么是人工智能?(深度好文,带你初步了解当下最火的AI)一定要看完!

    1 基本概念 定义 机器学习是一门研究如何通过计算手段 xff0c 利用经验提升自身性能的学科 人工智能 机器学习与深度学习三者间的关系如图1 1所示 1 1 人工智能定义 努力将通常由人类完成的智力任务自动化 1 2 机器学习定义 是一种
  • Java中Cookie详解

    最近复习到了Cookie和Session xff0c 这里系统的讲解一下Cookie和Session 在学习这个之前 xff0c 我们需要了解 xff0c 会话的定义 会话是指某一个人打开浏览器 xff0c 访问多个页面 xff0c 然后关
  • 关于ffmpeg,av_read_frame函数返回值小于0的错误

    自己写了一段将视频切成图片的程序 xff0c 在机器上运行 xff0c 发现每次切到10 就结束了 xff0c 截取av read frame返回值 xff0c 发现返回值是AVERROR EOF就是 541478725 xff0c 因为之
  • 在配置log4j.properties中出现问题 ERROR Could not find value for key log4j.appender.Console

    为了测试所有文件是否写好 xff0c 写了一个测试类运行程序 xff0c 报了几行的错误 xff0c 但是还是成功的输出的了数据库的东西 这里是需要在logj4f的配置文件中加上一些东西 xff0c 代码如下 xff1a 解决报错log4j
  • springboot项目启动报错:找不到或无法加载主类【已解决】

    在配 置完一个完整的springboot项目后 xff0c 需要测试是否正确配置 xff0c 出现未加载或未找到加载类的情况 xff0c 可能有以下原因 xff1a 首先需要观察启动类在项目中的位置 xff0c 确保启动类与其他层的包在同一
  • 对于 nested exception is java.net.ConnectException问题【已解决】

    当在springcloud遇到这类问题时 xff0c 需要排查控制器中的路径是否写对 xff0c 由于我报错的项目是一个模拟客户端访问查询业务功能 xff0c 下面是我的源代码 xff08 报错 xff09 xff1a public sta
  • 如何搭建一个基本的Spring项目【Maven】

    相信很多朋友在刚学习Spring时 xff0c 都会存在这个疑问 xff0c 如何正确搭建一个Spring项目 xff0c 以及中间的许多报错无法解决 xff0c 大家可以跟着我一起试一下 xff0c 有问题的朋友评论区见 1 Spring
  • 使用注解开发时需要添加包扫描器【出现问题的可以点进来看看】

    很多第一次接触Spring注解开发的同学 xff0c 在使用注解后容易报错 xff0c 那就很可能是没有在配置文件中加入包扫描器 那么可以往下看 xff0c 以下面这个简单的例子来学习 下面是一个简单的实体类 xff0c 通过Compone
  • 如何使用Autowried,以及与Resource的区别

    在使用注解开发的过程中 xff0c 有个经常会见面的朋友 Autowried xff08 自动装配 xff09 xff0c 刚接触的朋友肯定不能理解自动装配这个词的含义 简单解释一下 xff0c 自动装配将通过已知的类型自动分配对象 xff
  • SpringMVC遇到的有关实体类的报错

    今天在复习SpringMVC数据传参的时候 xff0c 出现了一个非常小的问题 xff0c 主要是为了实验如何将一个对象作为参数传递 xff0c 我创建了两个类 xff0c 但是由于被传递的对象的那个类没有用public 修饰 xff0c
  • app:checkDebugDuplicateClasses错误

    此异常完整表述为 org gradle api tasks TaskExecutionException Execution failed for task 39 app checkDebugDuplicateClasses 39 这类问题
  • LAMP网站架构

    一 LAMP网站架构 1 1 基本定义 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写 Linux xff0c 操作系统Apache xff0c 网页服务器 MariaDB或MySQL xff0c 数据库管理系
  • pancakeswap薄饼添加流动性后实现永久锁仓

    添加完流动性后 xff0c 永久锁仓就是放弃对资金池的控制 xff0c 就是放弃了对流动性的所有权 xff0c 没有办法撤池子了 现在锁仓分为2种 xff0c 一个是丢黑洞永久锁仓 xff0c 另外一种是短期锁仓 xff0c 锁在智能合约中
  • ubuntu14.04 root用户登录方法

    如果你是刚刚装完ubuntu14 04系统 xff0c 你进去后是以普通用户登录的 xff0c 很多操作并没有权限 xff0c 要想获得全部权限可以以root用户登录 1 先解除root锁定 xff0c 为root用户设置密码 打开终端输入
  • pycharm终端常用指令

    在调试ppddle的时候下载的coco数据集过大 xff0c 一时没有注意不急的如何终止 xff0c 所以转载一个记一下 Terminal快捷键 功能 Tab 自动补全 Ctrl 43 a 光标移动到开始位置 Ctrl 43 e 光标移动到
  • 解决Mac电脑因kotlin插件禁用导致的Android Studio无法打开问题

    解决这个办法需要将Android Studio目录下的disabled plugins txt文档中的org jetbrains kotlin删除即可 文件位置 Users mac Library Application Support G
  • 实现生产者消费者进程(Java)

    目录 前言 一 实验要求 二 步骤 1 主类 2 消费者 3 生产者 4 超市 前言 消费者问题是操作系统中典型的进程同步互斥问题 xff0c xff08 英语 xff1a Producer Consumer problem xff09 x