生产者-消费者问题-Java实现

2023-05-16

生产者-消费者问题在JAVA中实现的方法有多种,我写的是用  wait()  /  notify()实现;

 wait() / notify() 方法是基类 object 的两个方法。

wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行;

notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。

缓冲区 Storage.java 代码如下:

import java.util.LinkedList;

public class Storage
{
    // 仓库最大存储量
    private final int MAX_SIZE = 100;

    // 仓库存储的载体
    private LinkedList<Object> list = new LinkedList<Object>();

    // 生产产品
    public void produce(String producer)
    {
        synchronized (list)
        {
            // 如果仓库已满
            while (list.size() == MAX_SIZE)
            {
                System.out.println("仓库已满,【"+producer+"】: 暂时不能执行生产任务!");
                try
                {
                    // 由于条件不满足,生产阻塞
                    list.wait();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }

            // 生产产品            
            list.add(new Object());            

            System.out.println("【"+producer+"】:生产了一个产品\t【现仓储量为】:" + list.size());

            list.notifyAll();
        }
    }

    // 消费产品
    public void consume(String consumer)
    {
        synchronized (list)
        {
            //如果仓库存储量不足
            while (list.size()==0)
            {
                System.out.println("仓库已空,【"+consumer+"】: 暂时不能执行消费任务!");
                try
                {
                    // 由于条件不满足,消费阻塞
                    list.wait();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            
            list.remove();
            System.out.println("【"+consumer+"】:消费了一个产品\t【现仓储量为】:" + list.size());
            list.notifyAll();
        }
    }

    public LinkedList<Object> getList()
    {
        return list;
    }

    public void setList(LinkedList<Object> list)
    {
        this.list = list;
    }

    public int getMAX_SIZE()
    {
        return MAX_SIZE;
    }
}

Test.java 

public class Test {
    public static void main(String[] args)
    {
        Storage storage=new Storage();

        for(int i=1;i<6;i++)
        {
            int finalI = i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    storage.produce(String.format("生成者%d:", finalI));
                }
            }).start();
        }

        for(int i=1;i<4;i++)
        {
            int finalI = i;
            new Thread(()-> storage.consume(String.format("消费者%d:", finalI))).start();
        }
    }
}

运行结果:

仓库已空,【消费者1】: 暂时不能执行消费任务!
【生产者3】:生产了一个产品    【现仓储量为】:1
【消费者2】:消费了一个产品    【现仓储量为】:0
仓库已空,【消费者3】: 暂时不能执行消费任务!
【生产者1】:生产了一个产品    【现仓储量为】:1
【生产者4】:生产了一个产品    【现仓储量为】:2
【生产者2】:生产了一个产品    【现仓储量为】:3
【生产者5】:生产了一个产品    【现仓储量为】:4
【消费者1】:消费了一个产品    【现仓储量为】:3
【消费者3】:消费了一个产品    【现仓储量为】:2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产者-消费者问题-Java实现 的相关文章

  • OpenVINO 从yml处提取model下载链接,以mobile-ssd为例

    背景介绍 xff1a 最近需要下载公开模型 xff0c 无法从intel OpenVINO官方模型下载脚本中下载 报告ConnectionResetError Errno 104 Connection reset by peer xff0c
  • 短视频剪辑怎么做?4步教你快速入门

    最近看到很多小伙伴在问 xff0c 做短视频自媒体需要具备哪些技能 xff1f 要准备什么工具 xff1f 今天就给大家盘点一下 xff0c 短视频剪辑怎么做 xff0c 怎样才能快速入门 xff1a 01 剪辑软件 入门级别 xff1a
  • 短视频脚本怎么写?6个套路

    做短视频的基础就是脚本 xff0c 脚本是创作的基石 xff0c 是贯穿这个视频始末的逻辑 那么 xff0c 短视频脚本怎么做呢 xff1f 其实 xff0c 在拍摄脚本里面 xff0c 我们可以把所有的东西拆分为以下 6 个要素 xff1
  • 手机剪辑视频教程,初学者也能学会,上手快

    在过去的推文中 xff0c 和大家无数次的分享过剪映 xff0c 这是一个手机上就可以轻松实现视频剪辑的工具 xff0c 操作简单 xff0c 快速上手 对于想做短视频 xff0c 但是没有电脑的小伙伴 xff0c 如果你会用剪映 xff0
  • 推荐几个免费且高质量无版权的视频素材网站,记得收藏

    今天这篇文章给大家分享视频素材网站 xff0c 希望对大家有帮助 1 Coverr 第一个网站是Coverr Coverr是一个高质量的无版权视频素材下载网站 xff0c 有分类 xff0c 可以英文搜索 这个网站的视频素材质量还是很高的
  • 如何创作出优质的短视频文案?

    在短视频平台上进行创作 xff0c 视频才是重心点 xff0c 文案只不过是绿叶的辅助作用 xff0c 但常刷视频的小伙伴不难发现 xff0c 其实很多时候一句优质文案就可以把一条短视频推上热门 下面就和大家讲讲如何写出优质的文案 xff1
  • 短视频文案怎么吸引人,这几个技巧助你成为文案高手

    一 xff0e 人物状态 43 情感宣泄 61 情感共鸣 想要自己的视频上热门 xff0c 一定要和粉丝产生情感共鸣 xff0c 这样才能促使粉丝点赞 评论 转发 下面这个视频中的文案标题 xff1a 今天给外婆寄生活费回去 xff0c 电
  • 自媒体账号如何注册申请

    如何利用自媒体挣取到人生第一桶金 xff0c 建议大家可以从以下几个方面入手 一 申请自媒体账号 申请自媒体账号需要的材料 xff1a 身份证 xff0c 手机号 xff0c 辅助材料 xff1a 微信公众号或者博客写过文章的都可以 如果实
  • 自媒体人必备,5个免费找短视频素材的网站,赶紧收藏

    大家都知道做自媒体贵在坚持 xff0c 刚开始的时候你会发现还挺容易的 xff0c 但是到后面你会发现不知道发什么内容 xff0c 这时候可以用一些外部的素材来进行创作 xff0c 今天呢 xff0c 小易就给大家分享5个找视频素材的网站
  • 自媒体怎么做?5个操作步骤,普通人也可以做

    根据调查显示 xff0c 目前大家最爱做的副业就是自媒体 每天花1 2小时的时间 xff0c 不用才艺和露脸 xff0c 每天收入200左右 xff0c 比上班的工资还高 xff0c 操作非常的简单 小易整理了5个自媒体新手入门的操作步骤
  • 超好用的4个短视频素材下载网站,快收藏下来

    做过短视频运营的都知道 xff0c 最难的就是找素材 xff0c 在保证素材不侵权的情况下 xff0c 还有找高质量的内容 xff0c 真的很不容易 xff0c 很多人在这一步就已经头秃了 因此 xff0c 今天给大家安利一些超级好用的短视
  • [转] CMake入门

    转载说明 文章转自网络 xff0c 版权归原作者所有 xff0c 原文链接 https www hahack com codes cmake 特别感谢发哥 写代码的篮球痴 分享 文章目录 什么是 CMake 入门案例 xff1a 单个源文件
  • 抖音自媒体平台上最容易上热门的7大领域,你知道吗?

    抖音覆盖的内容领域日益广泛 xff0c 因此 xff0c 运营者在入驻抖音平台的时候不能过于草率 xff0c 不能单纯地根据个人偏好来确定账号的运营方向 本文将主要介绍在抖音平台上最容易上热门的7大领域 xff0c 以此来帮助运营者更好地进
  • 自媒体如何打造爆款呢,应该怎样掌握热点信息

    为什么优质的自媒体博主每天都在打造爆款 xff0c 无论是写文章还是拍视频 xff0c 他们的浏览量总位居前列 主要原因是因为平台推荐 xff1f 粉丝用户庞大 xff1f 这只是一部分原因 xff0c 能让他们从小V转变成大V的主要原因
  • 自媒体账号如何快速涨粉打造爆款,快来get这份运营技巧

    一 账号内容 在注册账号之后 xff0c 我们就要开始构思我们要发什么样的视频 xff0c 要知道我们想要将一个账号做好 xff0c 肯定不是像朋友圈一样 xff0c 今天发个日常 xff0c 明天发个自拍 xff0c 这样发布的作品会比较
  • FSK和GFSK

    1 FSK频移键控 频移键控 xff0c 英文缩写FSK 正弦振荡的频率在一组离散值间改变的角度调制 xff0c 其中每一离散值表示时间离散调制信号的一种特征状态 频移键控是利用两个不同频率F1和F2的振荡源来代表信号1和0 用数字信号的1
  • 多图详解!10大高性能开发核心技术

    程序员经常要面临的一个问题就是 xff1a 如何提高程序性能 xff1f 这篇文章 xff0c 我们循序渐进 xff0c 从内存 磁盘I O 网络I O CPU 缓存 架构 算法等多层次递进 xff0c 串联起高性能开发十大必须掌握的核心技
  • Mac系统中 用Virtualbox搭建CentOS虚拟机 鼠标光标占用、乱飞问题

    问题1 xff1a 我本人用的是MacBook Air xff0c 控制VirtualBox搭建 CentOS 7 的虚拟机时 xff0c 首先遇到了占用鼠标的问题 xff0c 如下图 看起来只需要点击 HostKey xff1a Righ
  • yum 仓库 (本地)

    首先要进入到 34 etc yum repos d 34 目录中 xff08 因为该目录存放着yum仓库的配置文件 xff09 cd etc yum repos d 使用vim或者vi编辑器创建一个名为local repo的新配置文件 xf
  • 噪声是什么?

    1 噪声的概念 日常我们说的噪声是 除了我想听到的声音 以外的声音 xff0c 就是噪声 比如我想听A君讲话 xff0c 但是B君和C君在旁边喋喋不休 xff0c 他们俩说的话是 我不想听到的声音 xff0c 那么他们两个的声音就是噪声 而

随机推荐