Java多线程编程实战:生产者与消费者问题的同步、互斥案例分析

前言

  • 生产者和消费者模式是一个十分经典的多线程协作模式,该模式又称为等待唤醒机制
  • 本质上就是打破多线程的随机性,使得线程轮流执行。

 问题分析

生产者和消费者问题:

  • 生产者生产数据,消费者消费数据,需要借助第三方控制线程的执行。
  •  理想情况:生产者生产一个数据,消费者消费一个数据。
  • 消费者等待:消费者先抢到cpu执行权,wait数据,生产者生产完数据后notify消费者。
  • 生产者等待:如果生产者再次抢到cpu执行权,而数据已经存在,则wait。

 案例分析

生产者和消费者(常见方法)

方法名称说明
void wait()当前线程等待,直到被其他线程唤醒
void notify()随机唤醒单个线程
void notifyAll()唤醒所有线程

 java里规定了每一个锁都对应了一个等待队列,唤醒的是锁上等待队列的线程。

 案例模型

案例源码

 Desk

public class Desk {/*作用:控制消费者和生产者的执行*///是否有面条  0:没有面条  1:有面条public static int foodFlag =0;//总个数public static int count =10;//锁对象public static Object lock = new Object();
}

Foodie

public class Foodie extends Thread{@Overridepublic void run() {/*1.循环2.同步代码块3.判断共享数据是否到了末尾(到了末尾)3.判断共享数据是否到了末尾(没有,执行核心代码块)*/while (true){synchronized (Desk.lock){if (Desk.count==0){break;}else{//判断是否有面条if (Desk.foodFlag==0){//如果没有,就等待try {Desk.lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}else {//把吃的总数-1Desk.count--;//如果有,就开吃System.out.println("吃货在吃面条,还能吃"+Desk.count+"碗!!");//吃完后唤醒厨师继续Desk.lock.notifyAll();//修改桌子状态Desk.foodFlag=0;}}}}}
}

Cook

public class Cook extends Thread {@Overridepublic void run() {/*1.循环2.同步代码块3.判断共享数据是否到了末尾(到了末尾)3.判断共享数据是否到了末尾(没有,执行核心代码块)*/while (true){synchronized (Desk.lock){if (Desk.count==0){break;}else {//判断桌子上是否有食物if(Desk.foodFlag==1){//如果有,就等待try {Desk.lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}else{//如果没有,就制作食物System.out.println("厨师做了一碗面条");//修改桌子上的食物状态Desk.foodFlag=1;//叫醒等待的消费者开吃Desk.lock.notifyAll();}}}}}
}

Demo

public class ThreadDemo {public static void main(String[] args) {/*需求:完成生产者和消费者(等待唤醒机制代码)、实现线程轮流执行的效果*///创建线程对象Cook c=new Cook();Foodie f = new Foodie();//给线程设置名字c.setName("厨师");f.setName("吃货");//开启线程c.start();f.start();}
}

总结 

一个等待唤醒机制的多线程协作模型,往往需要借助第三方来控制线程的执行流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The First项目报告:Puffer Finance如何破解LST/LRT赛道中心化难题?

10月09日The First上线了一种基于以太坊的协议,引入了重新质押的概念的生态协议EigenLayer。10月15日,一款搭建在 Eigenlayer 上原生流动性再质押平台 Puffer Finance 宣布其原生代币 PUFFER 将于 2024 年 10 月 15 日 07时(UTC8)…

Java基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

android11 usb摄像头添加多分辨率支持

部分借鉴于:https://blog.csdn.net/weixin_45639314/article/details/142210634 目录 一、需求介绍 二、UVC介绍 三、解析 四、补丁修改 1、预览的限制主要存在于hal层和framework层 2、添加所需要的分辨率: 3、hal层修改 4、frameworks 5、备…

多场景多任务建模(三): M2M(Multi-Scenario Multi-Task Meta Learning)

多场景建模: STAR(Star Topology Adaptive Recommender) 多场景建模(二): SAR-Net(Scenario-Aware Ranking Network) 前面两篇文章,讲述了关于多场景的建模方案,其中可以看到很多关于多任务学习的影子&…

CSS网页布局(重塑网页布局)

一、实现两列布局 许多网站有一些特点,如页面顶部放置一个大的导航或广告条,右侧是链接或图片,左侧放置主要内容,页面底部放置版权信息等 一般情况,此类网页布局的两列都有固定的宽度,而且从内容上很容易区…

Cherno游戏引擎笔记(73~90)

------- scene viewport ---------- 》》》》做了两件事:设置视口和设置相机比例 》》》》为什么要设置 m_ViewportSize 为 glm::vec2 而不是 ImVec2 ? 因为后面需要进行 ! 运算,而 ImVec2 没有这个运算符的定义,只有 glm::vec2 有这个运算…

linux 下 verilog 简明开发环境附简单实例

author: hjjdebug date: 2024年 10月 12日 星期六 10:34:13 CST descripton: linux 下 verilog 简明开发环境附简单实例 甲: 安装软件 1. sudo apt install iverilog 该包verilog 源代码的编译器iverilog,其输出是可执行的仿真文件格式vvp格式 它可以检查源代码中…

高效办公必备:2024四款免费PDF转换器推荐!

PDF文件的管理和转换离不开一些PDF转换器的使用。今天就给大家盘点几个好用免费的PDF转换器,帮助大家轻松应对各种文档转换任务 福昕PDF转换大师(365客户端) 直达链接:www.pdf365.cn/pdf2word/ 操作教程:立即获取 …

Windows系统总是占用内存过高的解决方法

文章目录 1. Antimalware Service Executable占用CPU过多1.1 问题1.2 解决方法:关闭实时保护,并且添加排除项 2. wsappx占用CPU过多2.1 问题2.2 解决方法:关闭应用更新等选项 3. 内存一直高于50%3.1 解决方法1:关机,重…

关于新国标强制电动车应内置北斗定位模块的规定有哪些?附北斗定位芯片对比参数

关于新国标要求电动自行车内置的北斗定位功能,需要符合以下几点: 支持UART或SPI接口至少支持接收处理北斗B1C和B2a信号具备定位信息的采集、存储和发送功能(其中定位信息包括:经度、纬度、速度、定位时间)具备采集、存…

C++之多继承

普通的继承中,子类的虚表是从父类拷贝过来的,子类新增加的特有的虚函数,会添加在这个虚表里。参考文章:CSDN 多继承 问:如果A1、A2中有相同的虚函数,覆盖谁的? 答案:覆盖A1的 多继承还存在一种特殊情况——…

Docker SDK for Python 交互

目录 1. 创建 Docker 客户端 2. 列出所有容器 3. 容器内执行命令 4. 启动和停止容器 5. 创建和运行新容器 6. 获取容器日志 7. 删除容器 8. 处理镜像 使用 Docker SDK for Python 进行交互非常方便,可以执行各种操作,如管理容器、镜像、网络等。…

动态规划-简单多状态dp问题——714.买卖股票的最佳时机含手续费

1.题目解析 题目来源:714.买卖股票的最佳时机含手续费——力扣 测试用例 2.算法原理 1.状态表示 本题有两种状态,一种是卖出状态一种是买入状态 我们创建两个dp表来分别存储这两种状态,f[]表示买入,g[]表示卖出 f[i]表示第i个位…

一个Idea:爆改 T480

爆改 T480 准备大改 T480,家里有一台闲置很久的 T480,不舍得扔,打算升级一下。看了几位up主的视频后,决定动手改造。 计划如下 网卡:加装4G网卡硬盘:更换为 1T 的 NVMe 2280 固态硬盘内存:升…

WordPress添加meta标签做seo优化

一、使用function.php文件添加钩子函数添加 方法1、使用is_page()判断不同页面的page_id进行辨别添加不同页面keyword和description (1)通过页面前台源码查看对应页面的id (2)或者通过wordpress后台,点击页面列表&…

基于BeautyEye开发Java程序用户界面

文章目录 I idea引入jar包添加本地jar包maven方式引入本地包方式1:将第三方JAR包安装到本地仓库maven方式引入本地包方式2:引用本地路径将本地jar包打进war包Maven内置变量说明II BeautyEye Swing外观实现方案案例III 知识扩展Swing常用的顶级容器BeautyEye SwingI idea引入j…

南京邮电大学电工电子A实验十二(集成触发器及其应用和计数与分频电路)

文章目录 一、实验报告预览二、Word版本报告下载 一、实验报告预览 二、Word版本报告下载 点我

6本“灌水神刊”SCI,沾边可录,可选非OA,1个月Accept!

01 录用快刊 1、Drones • 影响因子:4.4 • 期刊分区:JCR1区,中科院2区 • 检索数据库:SCI • 征稿领域:该杂志主要关注无人机的设计和应用,包括无人机(UAV)、无人机系统&#x…

100. UE5 GAS RPG 显示范围魔法的攻击范围

在这一篇里,我们将制作一个范围魔法,释放魔法时,我们将在鼠标拾取位置绘制一个魔法光圈,用于显示技能释放时攻击的范围,然后再次点击可以释放技能。 创建贴花类 魔法范围标识的光圈,我们采用贴花实现&…

测试200个用户在10秒之内同时访问百度的网页

右键添加->线程->线程组 得到下面的截图 线程数:就是模仿用户并发的数量,Ramp-up:运行线程的总时间,单位是秒,循环次数:就是每个线程循环多少次。 现在的线程数是200,就是相当于有200个用户&#xff…