当前位置: 首页 > news >正文

等待唤醒机制两种实现方法-阻塞队列

在这里插入图片描述
桌子上有面条-》吃货执行
桌子上没面条-》生产者制造执行
在这里插入图片描述

1、消费者等待

消费者先抢到CPU执行权,发现桌子上没有面条,于是变成等待wait状态,并释放CPU执行权,此时的CPU肯定会被厨师抢到,初始开始做面条,当厨师做完后会对吃货进行提示,notify唤醒吃货来吃。
在这里插入图片描述
在这里插入图片描述

2、生产者等待

厨师先抢到CUP执行权,但是桌子上有面条,就不能再制作面条,只能等待消费者吃完面条才能做,消费者吃完后需要唤醒厨师继续做
在这里插入图片描述
代码逻辑:
在这里插入图片描述
厨师:

public class Cook extends Thread{@Overridepublic void run() {//1循环//2同步代码块//3共享数据是否到末尾,Yes//4共享数据是否到末尾,Nowhile (true){synchronized (Desk.lock){if (Desk.count==0){break;//10碗吃完}else {//厨师的核心逻辑//01判断桌子上是否有食物if (Desk.foodflag==1){//02有食物就等待try {Desk.lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}else {//03没有System.out.println(Thread.currentThread().getName()+"制作食物");//04改变桌子状态Desk.foodflag=1;//05唤醒消费者吃Desk.lock.notifyAll();}}}}}
}

吃货:

public class Customer extends Thread{@Overridepublic void run() {while (true){synchronized (Desk.lock){if (Desk.count==0){break;//10碗吃完}else {//吃货的核心逻辑/** 1.判断桌子上有无面条* 2.没有:自己等待,* 3.有:吃完,并唤醒厨师做面条,count--* 4.修改桌子状态*/if (Desk.foodflag==0){//1.判断桌子上有无面条try {Desk.lock.wait();//2.没有:自己等待,} catch (InterruptedException e) {throw new RuntimeException(e);}}else {//3.有:吃完,并唤醒厨师做面条,count--Desk.count--;System.out.println(Thread.currentThread().getName()+"还能再吃"+Desk.count+"碗");Desk.lock.notifyAll();//4.修改桌子状态Desk.foodflag=0;}}}}}
}

桌子:

public class Desk {//通过变量来控制 0:没食物  1:有食物public static int foodflag=0;//总个数,最多做十碗public static int count=10;//锁对象public static Object lock=new Object();
}

//测试类

public class Test {public static void main(String[] args) {Customer customer = new Customer();Cook cook = new Cook();customer.setName("吃货");cook.setName("厨师");customer.start();cook.start();}
}

3、阻塞队列实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接口无法new对象,只能通过两个实现类,第一个可以自定义队列长度。
注意:生产者与消费者必须针对同一个阻塞队列,阻塞队列可以创建在测试类中
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
厨师:

public class Cook extends Thread{ArrayBlockingQueue<String> queue;//创建构造函数,创建对象的时候进行赋值,指定同一个阻塞队列public Cook(ArrayBlockingQueue<String> queue) {this.queue = queue;}@Overridepublic void run() {while (true){try {queue.put("面条");System.out.println("厨师做了一碗面条");} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

消费者:

public class Customer extends Thread{ArrayBlockingQueue<String> queue;public Customer(ArrayBlockingQueue<String> queue) {this.queue = queue;}@Overridepublic void run() {while (true){try {String food=queue.take();//tack底层也进行了加锁,不需要我们自己定义System.out.println("获取食物"+food);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

测试类:

public class Test {public static void main(String[] args) {ArrayBlockingQueue<String> queue=new ArrayBlockingQueue<>(1);Customer customer = new Customer(queue);Cook cook = new Cook(queue);customer.setName("吃货");cook.setName("厨师");customer.start();cook.start();}
}

相关文章:

等待唤醒机制两种实现方法-阻塞队列

桌子上有面条-》吃货执行 桌子上没面条-》生产者制造执行 1、消费者等待 消费者先抢到CPU执行权&#xff0c;发现桌子上没有面条&#xff0c;于是变成等待wait状态&#xff0c;并释放CPU执行权&#xff0c;此时的CPU肯定会被厨师抢到&#xff0c;初始开始做面条&#xff0c;…...

数组项相加和 – 如何将 JavaScript 数组中的数字相加

JavaScript 中的数组是一个对象&#xff0c;它允许您在单个变量名称下存储多个值的有序集合&#xff0c;并以多种方式操作这些值。 在本文中&#xff0c;您将学习如何使用几种不同的方法计算给定数组中所有数字的总和。 具体来说&#xff0c;使用以下方法得到数组中所有数字的总…...

C#和S7-1200PLC S7.NET通信

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。_s7协议批量…...

常用命令git branch

Git Branch 命令总结 列出分支 git branch&#xff1a;显示本地分支&#xff0c;当前分支会被标记。git branch -r&#xff1a;显示远程分支。git branch -a&#xff1a;显示所有本地和远程分支。 创建分支 git branch <branch_name>&#xff1a;创建一个新分支但不自…...

Android 制作系统签名

一、切换目录 cd build/target/product/security二、执行命令 1)将使用.pk8生成platform.priv.pem (.pem即可,文件名可随意修改)openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocrypt2)生成.p12,此时需输入两次密码,并且要记住 -name后所设置…...

C语言第13篇

1.下面程序是计算n个数的平均值,请填空.______ #include<stdio.h> void main( ) { int i,n; float x,avg0.0; scanf("%d",&n); for(i0;i<n;i) { scanf("%f",&x); avgavg______; } avg________; printf("avg%f\n",avg); } A) …...

基于FPGA的数字信号处理(22)--进位保存加法器(Carry Save Adder, CSA)

目录 1、拆解多个数的加法 2、进位保存加法器 3、CSA的优点和缺点 4、CSA电路的实现 文章总目录点这里&#xff1a;《基于FPGA的数字信号处理》专栏的导航与说明 1、拆解多个数的加法 考虑3个4bits数相加&#xff0c;10 4 7 21 的过程是这样的&#xff1a; 其中的红色数…...

idea使用free流程,2024idea、2023idea都可以安装免费使用

1.先到官网下载&#xff0c;这里选择win系统的&#xff0c;点击下图的.exe https://www.jetbrains.com/idea/download/?sectionwindows 2.下载好后基本上就是一直点击“下一步”到直到安装好&#xff0c;安装好后先打开软件后关闭退出 3.下载配配套资料 链接: https://pan.ba…...

设计模式 之 —— 抽象工厂模式

目录 什么是抽象工厂模式&#xff1f; 定义 特点 抽象工厂模式&#xff08;java代码示例&#xff09; 首先定义第一个接口 实现第一个接口的类 定义第二个接口 实现第二个接口的类 * 创建抽象工厂类 创建扩展了 AbstractFactory 的工厂类 饮料工厂 食物工厂 * 创建一个…...

计量经济学(十六)--一文读懂和学会医学统计学中的四种检验方法

1. 统计学是什么? 统计学是应用数学的一个分支,主要通过利用概率论建立数学模型,收集所观察系统的数据,进行量化的分析、总结,并进而进行推断和预测,为相关决策提供依据和参考。它被广泛的应用在各门学科之上,从物理和社会科学到人文科学,甚至被用来工商业及政府的情报…...

解析 C# Dictionary 代码

entries用于存储当前每个节点的数据&#xff0c;其中四个字段分别表示&#xff1a; hashCode&#xff1a;key对应的hash值next&#xff1a;处理hash冲突&#xff0c;可以理解为是一个链表结构&#xff0c;邻接表key&#xff1a;存储的keyvalue&#xff1a;存储的value bucket…...

如何利用人工智能提升工作效率

在当今这个信息爆炸的时代&#xff0c;我们每天都被大量的工作任务所困扰。然而&#xff0c;随着人工智能技术的不断发展&#xff0c;我们可以通过一些智能工具来提升我们的工作效率。在这篇文章中&#xff0c;我将分享一些关于如何利用人工智能提升工作效率的建议。 首先&…...

Linux驱动开发—Linux内核定时器概念和使用详解,实现基于定时器的字符驱动

文章目录 内核定时器概念在Linux驱动模块中使用定时器软定时器&#xff08;Soft Timers&#xff09;jiffies 含义高精度定时器&#xff08;High Resolution Timers&#xff09; 实现倒计时字符设备驱动 内核定时器概念 在 Linux 内核中&#xff0c;定时器是用来管理和调度延迟…...

mysql数据库:数据库,表和列的基本概念

mysql&#xff1a;数据库&#xff0c;表和列的基本概念以及导入和导出文件 数据库的概念和用途 数据库是一个有组织的数据集合&#xff0c;它们被存储在计算机上以便于管理和访问。数据库的主要目的是为了存储和管理数据&#xff0c;同时使数据能够被高效地访问、检索和更新。数…...

Nextjs 使用 graphql,并且接入多个节点

写在前面 随着区块链技术的流行&#xff0c;也促进了 subgraph 工具的兴起。那么如何在前端接入 graphql 节点就成了关键&#xff0c;其接入方式既存在与 restful 接口相类似的方式&#xff0c;也有其独特接入风格。本文将介绍如何接入 graphql 以及如何应对多个 graphql 节点…...

小结——知识注入

所谓知识注入&#xff0c;其实不该脱离于LLM的基础工作原理&#xff0c;然后空谈抽象概念。 知识&#xff0c;也就是你问他问题&#xff0c;他能输出正确的回答&#xff0c;这只是一个简单的输出token的过程。输出得准了&#xff0c;就是知识&#xff0c;输出不准了&#xff0c…...

科普文:微服务之Spring Cloud Alibaba组件Nacos一致性协议Distro+Raft概叙

一、概要 Nacos是阿里开放的一款中间件&#xff0c;它主要提供三种功能&#xff1a;持久化节点注册&#xff0c;非持久化节点注册和配置管理。 二、一致性协议 - AP/CP Nacos不是纯粹的AP服务&#xff0c;也不是纯粹的CP服务&#xff0c;而是两者同时支持。 这要从服务注册…...

python合并音视频-通过ffmpeg合并音视频

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…...

Yolov8添加ConvNetV1和V2模块

Yolov8添加ConvNet模块 1 ConvNet系列相关内容 &#xff08;1&#xff09;2022 论文地址&#xff1a;A ConvNet for the 2020s Code Link 如下图所示&#xff0c;精度、效率、尺寸都很不错。 论文的摘要如下&#xff1a; 视觉识别的“咆哮的 20 年代”始于视觉注意力 &…...

​十个常见的 Python 脚本 (详细介绍 + 代码举例)

1. 批量重命名文件 介绍: 该脚本用于批量重命名指定目录下的文件&#xff0c;例如将所有 ".txt" 文件重命名为 ".md" 文件。 import osdef batch_rename(directory, old_ext, new_ext):"""批量重命名文件扩展名。Args:directory: 要处理…...

【C语言】详解feof函数和ferror函数

文章目录 前言1. feof1.1 feof函数原型1.2 正确利用函数特性读写文件1.2.1 针对文本文件1.2.2 针对二进制文件 1.3 feof函数的原理1.4 feof函数实例演示 2. ferror2.1 ferror函数原型 前言 或许我们曾在网络上看过有关于feof函数&#xff0c;都说这个函数是检查文件是否已经读…...

ValueListenableBuilder 和 addListener 在 ChangeNotifier的区别

1、前言 ValueListenableBuilder 和 addListener 在 ChangeNotifier 中有不同的用途和用法&#xff0c;适用于不同的场景。它们的主要区别在于它们如何监听和响应状态变化&#xff0c;以及它们的用法和特性。 2、ValueListenableBuilder用法 ValueListenableBuilder 是一个 …...

ScriptEcho:AI赋能的前端代码生成神器

ScriptEcho&#xff1a;AI赋能的前端代码生成神器 在前端开发中&#xff0c;如果你总是觉得写代码太费时费力&#xff0c;那么 ScriptEcho 将成为你的救星。这个 AI 代码生成平台不仅能帮你省下大量时间&#xff0c;还能让你轻松愉快地写出生产级代码。本文将带你了解 ScriptEc…...

TypeError: ‘float’ object is not iterable 深度解析

TypeError: ‘float’ object is not iterable 深度解析与实战指南 在Python编程中&#xff0c;TypeError: float object is not iterable是一个常见的错误&#xff0c;通常发生在尝试对浮点数&#xff08;float&#xff09;进行迭代操作时。这个错误表明代码中存在类型使用不…...

灵茶八题 - 子序列 +w+

灵茶八题 - 子序列 w 题目描述 给你一个长为 n n n 的数组 a a a&#xff0c;输出它的所有非空子序列的元素和的元素和。 例如 a [ 1 , 2 , 3 ] a[1,2,3] a[1,2,3] 有七个非空子序列 [ 1 ] , [ 2 ] , [ 3 ] , [ 1 , 2 ] , [ 1 , 3 ] , [ 2 , 3 ] , [ 1 , 2 , 3 ] [1],[…...

为什么美元债务会越来越多?

美元债务规模持续膨胀&#xff0c;其背后原因复杂多样&#xff0c;可归结为以下几个主要因素&#xff1a; 财政赤字和刺激政策是导致美元债务增加的重要原因。美国政府长期面临财政赤字问题&#xff0c;支出远超收入&#xff0c;为弥补这一缺口&#xff0c;政府不得不大量发行…...

二维凸包算法 Julia实现

问题描述&#xff1a;给定平面上 n n n 个点的集合 Q Q Q&#xff0c;求其子集 P P P 构成 Q Q Q 的凸包&#xff0c;即 ∀ p ∈ Q , ∃ p 0 , p 1 , p 2 ∈ P \forall p \in Q, \exist p_0, p_1, p_2 \in P ∀p∈Q,∃p0​,p1​,p2​∈P 使得点 p p p 在以点 p 0 , p 1 …...

python dash框架

Dash 是一个用于创建数据分析型 web 应用的 Python 框架。它由 Plotly 团队开发&#xff0c;并且可以用来构建交互式的 web 应用程序&#xff0c;这些应用能够包含图表、表格、地图等多种数据可视化组件。 Dash 的特点&#xff1a; 易于使用&#xff1a;Dash 使用 Python 语法…...

2.外部中断(EXTI)

理论 NVIC&#xff1a;嵌套向量中断控制器&#xff08;解释教程&#xff09; 外部通用中断线(EXTI0~EXTI15)&#xff1a;每个GPIO设置成中断模式&#xff0c;与中断控制器连接的线 外部中断触发方式 上升沿触发、下降沿触发、双边沿触发 外部中断触发函数 在stm32f1xx_it.c文件…...

Python | SyntaxError: invalid syntax 深度解析

Python | SyntaxError: invalid syntax 深度解析 在Python编程中&#xff0c;SyntaxError: invalid syntax是一个常见的错误&#xff0c;它表明Python解释器在尝试解析代码时遇到了语法问题。这个错误通常是由于代码中存在拼写错误、缺少符号&#xff08;如括号、冒号或逗号&a…...

微网站建设市场分析/网页设计代码案例

#include <stdio.h> void test(){//1234.....100 int a,b; a0; b0; for ( ; a<100; a) { bba; printf("%d\n",b); } } void test1(){//输入一个数&#xff0c;看一下是不是质数 int c; printf("请输入一个大于10的数字:"); scanf("%d",…...

网站开发是什么工作/seo推广员是做什么的

OGNL表达式 OGNL:对象视图导航语言(Object-Graph Navigation Language)&#xff0c;${user.addr.name} 这种写法就叫对象视图导航OGNL不仅仅可以视图导航&#xff0c;支持比EL表达式更加丰富的功能 1、使用OGNL准备工作 1.1 导包&#xff1a;struts2 的包中已经包含了&#xff…...

对做网站有什么建议/百度账号怎么注册

铜公火花间隙大小决定了模仁粗糙度 一、 铜公拆分要点和经验总结 火花机就是电火花加工机床&#xff0c;又称 EDM &#xff0c;铜公又称为电极&#xff0c;主要是加工其他机床难以加工的部位&#xff0c;如一些窄槽、加强肋或一些倾角之类的模具结构&#xff0c;加工原理就是…...

wordpress 插件和工具栏/石家庄网站关键词推广

1.官网给的命令快速安装基本没用&#xff01;&#xff01;&#xff08;结果就是一直拒绝你的连接&#xff09; 官网&#xff1a;https://spacy.io/ 官网是说用下面的两行命令就能够快速安装并使用spacy了&#xff0c;第一行命令是可以很快就成功&#xff0c;但是第二行就来坑了…...

做彩票网站抓到判几年/安卓优化大师手机版下载

thanks for your time.我写了一个爬虫&#xff0c;执行到某一步时&#xff0c;获取一个地址的set&#xff0c;传入到这个文件中&#xff0c;开始下载图片from urllib import requestimport sslssl._create_default_https_context ssl._create_unverified_context;class Downlo…...

建设自己网站教程/西安关键词seo公司

为了方便&#xff0c;一般在本地的测试环境中我都使用了 XAMPP 或者 LAMPP 。&#xff08;Apache Friends XAMPP&#xff09;但是默认的XAMPP中没有提供xhprof的支持&#xff0c;为此需要自己独立编译。下面记录了编译的过程。1、如果你的XAMPP没有 DEVEL包&#xff0c;那么编译…...