生产者消费者代码实现(JAVA)

2023-05-16

 

代码 

import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;

final class Message{//单条消息
    private int id;
    private String message;

    public Message(int id, String message) {
        this.id = id;
        this.message = message;
    }
    public int getId() {
        return id;
    }
    public String getMessage() {
        return message;
    }
}

@Slf4j(topic = "c.MessageQueue")//日志打印注解,可以用System.out.println()替代
class MessageQueue{//消息队列
    private static LinkedList<Message> linkedList = new LinkedList();
    private int capacity;//队列容量

    public MessageQueue(int capacity) {
        this.capacity = capacity;
    }

    public void productor(Message message){//生产
        synchronized (linkedList){//对象上锁
            while (linkedList.size() == capacity){//消息队列满,无法生产入队
                try {
                    log.debug("队列已满, 生产者线程等待");
                    linkedList.wait();//进入waitSet等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            linkedList.addLast(message);//消息队列未满,进行入队添加
            linkedList.notifyAll();//唤醒waitSet中线程
            log.debug("product message:{} id:{}",message.getMessage(),message.getId());//可以用System.out.println()替代
        }
    }
    public void consumer(){//消费
        synchronized (linkedList){//对象上锁
            while (linkedList.isEmpty()){//消息队列空,无法消费出队
                try {
                    log.debug("队列为空, 消费者线程等待");
                    linkedList.wait();//进入waitSet等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            Message message = linkedList.removeFirst();//消息队列不空,进行出队移除
            log.debug("consumer message:{} id:{}",message.getMessage(),message.getId());//可以用System.out.println()替代
            linkedList.notifyAll();//唤醒waitSet中线程
        }
    }

}
@Slf4j(topic = "c.BoundedBufferProblem")
public class BoundedBufferProblem {
    public static void main(String[] args) throws InterruptedException {
        MessageQueue queue = new MessageQueue(2);//初始队列容量为2
        for (int i = 0; i < 5; i++) {//生产编号0-4的消息,生产线程
            int id = i;
            new Thread(()->{
                queue.productor(new Message(id,"message:"+id));//调用生产方法
            }, "productor :"+i).start();//每个消息对应一个线程启动
        }

        new Thread(()->{//消费线程
            while (true){//一直消费直至队列为空
                try {
                    Thread.sleep(1000);
                    queue.consumer();//调用消费方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "consumer").start();//线程启动

    }
}

测试结果

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

生产者消费者代码实现(JAVA) 的相关文章

  • python经典书籍推荐-7本经典的Python书籍,你都读过了么?

    许多程序员都认为Python是最适合作为入门的编程语言 xff0c 而有的程序员却认为Python是你应该学的最后一门编程语言 xff0c 无论如何 xff0c 毋庸置疑Python是一门非常流行的编程语言 xff0c 根据TIOBE In
  • python画轨迹曲线-matplotlib绘制随机行走轨迹图

    coding utf 8 author 61 39 pythonwu 39 date 61 34 2018 6 15 16 09 34 from random import choice randint import matplotlib
  • python游戏编程入门书籍推荐-游戏编程入门书籍推荐:想要游戏编程尽快入门这些书不要错过...

    游戏编程一直都是编程之中的一大热点 xff0c 这也是由于游戏本身的火热造成的结果 xff0c 所以每年都有很多人在关注着游戏编程 介于此小编今天就来将一些好的游戏编程入门书籍推荐给大家 xff0c 希望对想要了解和学习游戏编程的朋友能够有
  • 用python画关系网络图-使用Python的networkx绘制精美网络图教程

    最近因为数学建模3天速成Python 然后做了一道网络的题 xff0c 要画网络图 在网上找了一些 xff0c 发现都是一些很基础的丑陋红点图 xff0c 并且关于网络的一些算法也没有讲 xff0c 于是自己进http networkx g
  • reactor和proactor模式

    首先就第一篇 Reactor模式 xff0c 或者叫反应器模式 做一下笔记 xff1a 刚开店做生意 xff0c 老板为了给顾客一个美好的印象 xff0c 给顾客最好的服务 xff0c 一对一 随着经营的生意越来越好 xff0c 顾客多了
  • 进程间通信的方式——信号、管道、消息队列、共享内存

    进程间通信的方式 信号 管道 消息队列 共享内存 多进程 xff1a 首先 xff0c 先来讲一下fork之后 xff0c 发生了什么事情 由fork创建的新进程被称为子进程 xff08 child process xff09 该函数被调用
  • 利用netstat查看http为短连接还是长连接?

    最近 xff0c 公司在做Redis替换memcached的项目 xff0c 那mc可以设置是长连接 xff0c 那组件中的Redis到底用的是长连接还是短连接呢 xff1f 大牛军哥只给我一个命令 xff1a netstat anp gr
  • 系统总体结构设计

    系统总体结构设计 系统设计工作应该自顶向下地进行 首先设计总体结构 xff0c 然后再逐层深入 xff0c 直至进行每一个模块的设计 总体设计主要是指在系统分析的基础上 xff0c 对整个系统的划分 xff08 子系统 xff09 机器设备
  • 业务层 、服务层、数据层、表现层

    表现层 xff1a 它一方面为用户提供了交互的工具 xff0c 另一方面也为显示和提交数据实现了一定的逻辑 xff08 页面展示和各种交互包括提交 xff09 业务逻辑层 xff1a 包含了系统所需要的所有功能上的算法和计算过程 xff0c
  • Java FTPClient上传图片

    首先要使用common net的包 xff1a FTP服务器搭建过程 xff1a https mp csdn net postedit 88722082 package com taotao test ftp import java io
  • 直播疑难杂症排查(7)— 黑屏、花屏、闪屏问题

    本文是 直播疑难杂症排查 系列的第七篇文章 xff0c 我们来重点看看直播中常见的各种黑屏 花屏 闪屏问题 首先我们要明白 xff0c 黑屏 花屏 闪屏等问题 xff0c 可能是推流端的问题 xff0c 也可能是播放器的问题 xff0c 遇
  • 视频编码:H.264编码

    本文参考毕厚杰老师 新一代视频压缩编码标准 H 264 AVC 一书以及雷霄骅博客 视音频编解码技术零基础学习方法 整理 1 概念部分 xff1a H 264编码 xff1a 视频编解码技术有两套标准 xff0c 国际电联 xff08 IT
  • war包方式部署solo博客

    solo xff0c 一款小而美的博客系统 xff0c GitHub xff1a https github com b3log solo 环境和文件准备 服务器 xff1a 用的阿里云服务器 xff0c 系统是 CentOS 7 3 64
  • 游戏服务器之网关实现

    网关需要与客户端保证连接 这里网关使用Netty4来做为网络通信框架 它也是目前在Java游戏服务器开发中 xff0c 长连接使用最多的框架 1 xff0c 管理与客户端的连接 客户端连接到网关之后 xff0c 并且验证过之后 xff0c
  • zeromq源码分析笔记之准备

    zeromq这个库主要用于进程通信 xff0c 包括本地进程 网络通信 xff0c 涉及到一些基础知识 xff0c 主要包括管道通信 xff0c socket编程的内容 xff0c 反应器模式 xff08 使用IO多路复用实现 xff09
  • MySQL灵魂十连

    1 SQL语句执行流程 MySQL大体上可分为Server层和存储引擎层 两部分 Server层 xff1a 连接器 xff1a TCP握手后服务器来验证登陆用户身份 xff0c A用户创建连接后 xff0c 管理员对A用户权限修改了也不会
  • 前端面试知识点

    本专题按照以下几个方便进行整理 xff1a HTTP amp amp 浏览器HTML amp amp CSSJS TS ES6VueReact构建工具 amp amp 工程化性能优化 适合初次全面复习的同学 xff0c 查缺补漏 xff0c
  • 使用matplotlib绘制动画

    使用matplotlib绘制动画的步骤 本文采用moviewriter来绘制 xff0c 避免采用matplotlib animition的动画绘制方法 xff0c 将动画简化为图片一帧一帧播放 使用总共三步 xff0c 如下代码所示 补充
  • CUDA与cuDNN

    1 什么是CUDA CUDA ComputeUnified Device Architecture xff0c 是显卡厂商NVIDIA推出的运算平台 CUDA是一种由NVIDIA推出的通用并行计算架构 xff0c 该架构使GPU能够解决复杂
  • JAVAFX 简易项目构建从0到1全流程

    1 安装JDK 2 安装SceneBuilder 可集成到eclipse等IDE中 3 在IDE中新建Java Project项目 并按设计的架构设计建立代码架构 例如 xff1a 4 新建要搭建的界面fxml文件 xff0c 用Scene

随机推荐

  • Pandas DataFrame

    http pandas pydata org pandas docs stable api html dataframe 构造函数 方法描述DataFrame data index columns dtype copy 构造数据框 属性和数
  • Android Settings定制

    android frameworks base packages SettingsLib 7 0重构Settings后多出来的部分 android frameworks base packages SettingsProvider sett
  • GNOME图形界面的基本操作

    成功登录进入CentOS系统之后 xff0c 我们首先看到的桌面就是GNOME图形界面 xff0c 下面来看一下相关的基本操作 个性化设置 1 xff0c 设置屏幕分辨率 进入菜单 2 xff0c 更换桌面背景 进入下面菜单 选择一张背景图
  • 连接服务器VNC

    1 xff0c 启动vnc vncserver 2 xff0c 提示输入密码 3 xff0c Would you like to enter a view only password y n 选择n 4 xff0c 会生成一个端口号 5 更
  • Android基础知识(七):Activity互调之间的生命周期变化与onNewIntent()触发机制

    Android基础知识 xff08 七 xff09 xff1a Activity互调之间的生命周期变化与onNewIntent 触发机制 一 Activity切换的生命周期 前面Android基础知识 xff08 五 xff09 xff1a
  • 二叉树节点和度的关系及特点

    写在前边的话 xff1a 你的支持是我写作的动力 xff0c 有帮助到你的话麻烦点赞 加收藏 呦 感激不尽 xff01 如有错误也请留言指正 目录 一 完全二叉树 节点总数的特点 二 二叉树 度的特点 1 n0与n2的关系 2 节点总数和度
  • 平衡二叉树的最大深度和最少节点数

    写在前边的话 xff1a 你的支持是我写作的动力 xff0c 有帮助到你的话麻烦点赞加收藏呦 感激不尽 xff01 如有错误也请留言指正 考研数据结构练习 xff0c 欢迎订阅我的专辑 考研数据结构题型分类讲解练习 目录 一 知识点 二 例
  • dataturks解析

    34 34 34 根据大json写小json 34 34 34 with open 39 pay json 39 as f datas 61 f readlines for data in datas data 61 data strip
  • STM32串口之环形队列接收数据

    原文链接 xff1a STM32串口之环形队列接收数据 码代码的应该学数据结构都学过队列 环形队列是队列的一种特殊形式 xff0c 应用挺广泛的 因为有太多文章关于这方面的内容 xff0c 理论知识可以看别人的 xff0c 下面写得挺好的
  • Linux使用ssh远程登陆

    什么是SSH xff1f 简单说 xff0c SSH是一种网络协议 xff0c 用于计算机之间的加密登录 如果一个用户从本地计算机 xff0c 使用SSH协议登录另一台远程计算机 xff0c 我们就可以认为 xff0c 这种登录是安全的 x
  • 使用Vscode 编译 开发 调试 STM32单片机 VScode+openocd+STM32CubeMX+GDB

    Vscode 编译 开发 调试 STM32单片机 为什么记录这篇文章环境准备软件及工具下载软件安装 VScode功能搭建使用STM32CubeMX生成带有makefile的工程配置VScode工程 使用vscode 开发 xff0c 编译
  • 出错信息“module or group tools is not avaliable”

    出错信息 module or group tools is not avaliable 使用yum安装软件时 xff0c 有时会出现这个问题 xff0c 可能是需要安装的软件来自第三方 解决办法 yum install epel relea
  • ubuntu 自动登录/图形界面启动流程

    ubuntu 自动登录 图形界面启动流程 启动流程配置greeter和desktop自动登录配置自动登录后进入的desktop总结 这两天在Jetson nano 上想做一个跳过用户界面直接自动登录到桌面的功能 本来很简单的在System
  • Ubuntu update-alternatives 安装/管理多版本 Python3及PIP3

    Ubuntu update alternatives 安装 管理多版本 Python3及PIP3 前言安装python安装对应版本pipupdate alternatives 切换python3 环境 前言 在ubuntu系统上 xff0c
  • 实用的Visual Studio Code插件

    1 vscode color highlight 颜色代码高亮插件 xff08 sublime text也有 xff09 2 vscode Open in Browser 右键在浏览器打开 xff08 sublime text也有 xff0
  • LWIP 双IP实现

    LwIP是Light Weight 轻型 IP协议 xff0c 有无操作系统的支持都可以运行 LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用 xff0c 它只需十几KB的RAM和40K左右的ROM就可以运行 xff
  • Seata解析-seata部署启动初体验

    本文基于seata 1 3 0版本 seata是由阿里巴巴开源的分布式事务框架 xff0c 用于在分布式环境中保持事务一致性 它提供了四种事务模式 xff1a AT TCC SAGA 和 XA 事务模式 xff0c 默认是AT模式 Seat
  • 功能案例----java实现语音播报功能

    功能案例 java实现语音播报功能 根据自己最近的写的项目 xff0c 总结整理了关于java语音播报功能的方法 xff0c 可分为两种形式 一种是通过自己写出一个语音播报方法的工具类 xff0c 然后从前端获取文本数据 xff0c 最后跳
  • spring mvc拦截器 需求:在controller层的方法上,使用自定义注解的方式 不拦截指定请求

    原来是在controller类上实现此需求 缺点 xff1a 只能是整个controller类下的方法全部放开拦截 xff0c 不能放开其中某个方法 xff0c 颗粒度太高 现实现在方法上增加注解 xff0c 更加细颗粒度 1 首先是自定义
  • 生产者消费者代码实现(JAVA)

    代码 import lombok extern slf4j Slf4j import java util LinkedList final class Message 单条消息 private int id private String m