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

多线程:管程法

管程法

  • 生产者把生产好的数据放入缓冲区,消费者从缓冲区拿出数据
package jingcheng.test.gaoji;
//测试生产者消费者模型-->利用缓冲区解决:管程法
//生产者,消费者,产品,缓冲区
public class TestPc {public static void main(String[] args) {SynContainer container = new SynContainer();new Productor(container).start();new Consumer(container).start();}
}
//生产者
class Productor extends Thread{SynContainer container;public Productor(SynContainer container){this.container = container;}//生产@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("生产了"+i+"只鸡");container.push(new Chicken(i));}}
}
//消费者
class Consumer extends Thread{SynContainer container;public Consumer(SynContainer container){this.container=container;}//消费@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("消费了-->"+container.pop().id+"只鸡");}}
}
//产品
class Chicken{int id;//产品编号public Chicken(int id) {this.id = id;}
}
//缓冲区
class SynContainer{//需要一个容器大小Chicken[] chickens = new Chicken[10];//容器计数器int count = 0;//生产者放入产品public synchronized void push(Chicken chicken){//如果容器满了就要等待消费者消费if(count == chickens.length){try {this.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}//通知消费者消费,生产者等待}//如果没满,就要丢入产品chickens[count]=chicken;count++;//可以通知消费者消费了this.notifyAll();}//消费者消费产品public synchronized Chicken pop(){//判断能否消费if(count == 0){try {this.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}//等待生产者生产,消费者等待}//如果可以消费count--;Chicken chicken = chickens[count];//吃完了,通知生产者生产this.notifyAll();return chicken;}}

生产了0只鸡
生产了1只鸡
生产了2只鸡
生产了3只鸡
生产了4只鸡
生产了5只鸡
生产了6只鸡
生产了7只鸡
生产了8只鸡
生产了9只鸡
生产了10只鸡
生产了11只鸡
消费了–>9只鸡
消费了–>10只鸡
消费了–>8只鸡
消费了–>7只鸡
消费了–>6只鸡
消费了–>5只鸡
消费了–>4只鸡
消费了–>3只鸡
消费了–>2只鸡
生产了12只鸡
生产了13只鸡
生产了14只鸡
生产了15只鸡
生产了16只鸡
生产了17只鸡
生产了18只鸡
生产了19只鸡
生产了20只鸡
消费了–>15只鸡
消费了–>19只鸡
消费了–>18只鸡
消费了–>17只鸡
消费了–>16只鸡
消费了–>14只鸡
消费了–>13只鸡
消费了–>20只鸡
消费了–>12只鸡
消费了–>11只鸡
消费了–>1只鸡
消费了–>0只鸡
生产了21只鸡
生产了22只鸡
生产了23只鸡
生产了24只鸡
生产了25只鸡
生产了26只鸡
生产了27只鸡
生产了28只鸡
生产了29只鸡
生产了30只鸡
生产了31只鸡
消费了–>30只鸡
消费了–>29只鸡
消费了–>28只鸡
消费了–>27只鸡
消费了–>26只鸡
消费了–>31只鸡
消费了–>25只鸡
消费了–>24只鸡
消费了–>23只鸡
消费了–>22只鸡
消费了–>21只鸡
生产了32只鸡
生产了33只鸡
生产了34只鸡
生产了35只鸡
生产了36只鸡
生产了37只鸡
生产了38只鸡
生产了39只鸡
生产了40只鸡
生产了41只鸡
生产了42只鸡
消费了–>41只鸡
消费了–>40只鸡
消费了–>39只鸡
生产了43只鸡
生产了44只鸡
生产了45只鸡
生产了46只鸡
消费了–>42只鸡
消费了–>45只鸡
消费了–>44只鸡
消费了–>43只鸡
消费了–>38只鸡
消费了–>37只鸡
消费了–>46只鸡
消费了–>36只鸡
消费了–>35只鸡
消费了–>34只鸡
消费了–>33只鸡
消费了–>32只鸡
生产了47只鸡
生产了48只鸡
生产了49只鸡
生产了50只鸡
生产了51只鸡
生产了52只鸡
生产了53只鸡
生产了54只鸡
生产了55只鸡
生产了56只鸡
生产了57只鸡
消费了–>56只鸡
消费了–>55只鸡
消费了–>54只鸡
消费了–>57只鸡
消费了–>53只鸡
消费了–>52只鸡
消费了–>51只鸡
消费了–>50只鸡
消费了–>49只鸡
消费了–>48只鸡
消费了–>47只鸡
生产了58只鸡
生产了59只鸡
生产了60只鸡
生产了61只鸡
生产了62只鸡
生产了63只鸡
生产了64只鸡
生产了65只鸡
生产了66只鸡
生产了67只鸡
生产了68只鸡
生产了69只鸡
消费了–>67只鸡
消费了–>68只鸡
消费了–>66只鸡
消费了–>65只鸡
消费了–>64只鸡
消费了–>63只鸡
生产了70只鸡
生产了71只鸡
生产了72只鸡
生产了73只鸡
生产了74只鸡
生产了75只鸡
消费了–>69只鸡
消费了–>74只鸡
消费了–>75只鸡
消费了–>73只鸡
消费了–>72只鸡
消费了–>71只鸡
消费了–>70只鸡
消费了–>62只鸡
消费了–>61只鸡
消费了–>60只鸡
消费了–>59只鸡
消费了–>58只鸡
生产了76只鸡
生产了77只鸡
生产了78只鸡
生产了79只鸡
生产了80只鸡
生产了81只鸡
生产了82只鸡
生产了83只鸡
生产了84只鸡
生产了85只鸡
生产了86只鸡
消费了–>85只鸡
消费了–>84只鸡
消费了–>83只鸡
消费了–>82只鸡
消费了–>81只鸡
消费了–>80只鸡
消费了–>79只鸡
消费了–>78只鸡
消费了–>77只鸡
消费了–>76只鸡
生产了87只鸡
生产了88只鸡
生产了89只鸡
生产了90只鸡
生产了91只鸡
生产了92只鸡
生产了93只鸡
生产了94只鸡
生产了95只鸡
生产了96只鸡
生产了97只鸡
消费了–>92只鸡
消费了–>96只鸡
消费了–>95只鸡
消费了–>94只鸡
消费了–>93只鸡
消费了–>91只鸡
消费了–>90只鸡
消费了–>97只鸡
消费了–>89只鸡
消费了–>88只鸡
消费了–>87只鸡
消费了–>86只鸡
生产了98只鸡
生产了99只鸡
消费了–>99只鸡
消费了–>98只鸡

相关文章:

多线程:管程法

管程法 生产者把生产好的数据放入缓冲区&#xff0c;消费者从缓冲区拿出数据 package jingcheng.test.gaoji; //测试生产者消费者模型-->利用缓冲区解决&#xff1a;管程法 //生产者&#xff0c;消费者&#xff0c;产品&#xff0c;缓冲区 public class TestPc {public st…...

7.1 String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

可变性 简单的来说&#xff1a;String 类中使用 final 关键字修饰字符数组来保存字符串&#xff0c;private final char value[]&#xff0c;所以String 对象是不可变的。 补充&#xff08;来自issue 675&#xff09;&#xff1a;在 Java 9 之后&#xff0c;String 、StringBu…...

【C++STL标准库】容器适配器

功能&#xff1a;将功能类似&#xff0c;但是接口不符合的接口转换成另一个接口 stack 栈stack&#xff08;栈&#xff09; 特点&#xff1a;先入后出&#xff0c;只能从栈顶弹出值&#xff0c;只能从栈顶压入值 也就是说栈需要的功能&#xff1a;push_back、pop_back 所以可…...

2023深圳杯(东三省)数学建模ABC题思路及代码

大家好呀&#xff0c;比赛开赛后我一直在去写各个题&#xff0c;深圳杯的难度还是比较大的&#xff0c;在这里给大家带来初步的选题建议及思路。 本次深圳杯小白推荐选择A题&#xff0c;数据分析类题目无论怎样都能完成论文&#xff0c;内容也会比较丰富。学过嵌入信息的可以选…...

Set集合类详解(附加思维导图)

目录 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 2.2、TreeSet集合的使用 三、HashSet、LinkedHashSet、TreeSet的使用场景 四、list和set集合的区别 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 ①&#xff1a;add…...

【vue3】vue3接收props以及emit的用法

技术&#xff1a;vue3.2.40 UI框架&#xff1a;arco-design 2.44.7 css技术&#xff1a;less 4.1.3 实现&#xff1a;子组件接收props以及通过emit方法传值父组件 vue3使用的组合式API&#xff0c;我这里使用的是defineComponent 1.父页面调用子组件 <template><d…...

【Lua学习笔记】Lua入门

文章目录 Lua变量数据类型变量声明其他表示 Lua语法判断逻辑判断&#xff08;Lua很特殊&#xff0c;这个比较重要&#xff09;短路判断 ifif else 循环whileforrepeat 迭代器泛型for迭代器无状态迭代器多状态的迭代器 Lua函数select方法 数组字符索引_G &#xff08;不是教程&a…...

LLM Data Pipelines: 解析大语言模型训练数据集处理的复杂流程

编者按&#xff1a;在训练大语言模型的过程中,构建高质量的训练数据集是非常关键的一步&#xff0c;但关于构建大模型训练所需数据集的通用数据处理流程&#xff08;Data pipelines)的相关资料极为稀少。 本文主要介绍了基于Common Crawl数据集的数据处理流程。首先,文章概述了…...

如何使用postman判断返回结果是否正确

针对一个接口&#xff0c;我们在知道参数以及参数对应的结果时&#xff0c;可以通过postman进行判断&#xff0c;验证返回数据是否与预期数据相等。这样可以使我们的接口测试更加的方便简洁。 1、准备数据。 postman可以接受的文件格式如图所示&#xff0c;一般来说可以将我们…...

A General framework for Prompt

你已经知道了 Prompt 可以具有一些通用的结构&#xff0c;比如一个简单的Prompt 结构: 能否帮我为我的课程 TAI自动化&#xff0c;设计一套数字营销策略? Action 我们的目标是激发目标受众一一那些希望利用人工智能简化工作流的人们的兴趣&#xff0c;并提高课程的知名度。 G…...

使用python将PDF转word

实现功能&#xff0c;将程序所在当前路径下的所有PDF文件转化为word import os from pdf2docx import Converter# 获取当前路径 current_path os.getcwd()# 遍历当前路径下的所有文件和文件夹 for file_name in os.listdir(current_path):# 检查文件是否为 PDF 文件if file_n…...

CMU 15-445 -- Logging Schemes - 17

CMU 15-445 -- Logging Schemes - 17 引言IndexFailure ClassificationTransaction FailuresSystem FailuresStorage Media Failures Buffer Pool PoliciesShadow Paging: No-Steal ForceWrite-Ahead Log (WAL): Steal No-ForceLogging SchemesCheckpoints小结 引言 本系列为…...

逻辑回归分析实战(根据鸢尾花的性质预测鸢尾花类别)

紧接着上过一个线性回归模型&#xff08;一元线性回归模型实战&#xff09; 一元线性回归模型和逻辑回归模型是统计学中常见的两种回归模型&#xff0c;它们有以下几点不同之处&#xff1a; 1. 目标变量类型&#xff1a;一元线性回归模型适用于连续型目标变量&#xff0c;即预测…...

【每日一题】2050. 并行课程 III

【每日一题】2050. 并行课程 III 2050. 并行课程 III题目描述解题思路 2050. 并行课程 III 题目描述 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。同时给你一个二维整数数组 relations &#xff0c;其中 relations[j] [prevCoursej, nextCour…...

【kubernetes系列】kubernetes之使用kubeadm搭建高可用集群

概述 目前来说&#xff0c;kubernetes集群搭建的方式很多&#xff0c;选择一个稳定的适合自己的很重要。目前使用kubeadm方式搭建k8s集群还是很常见的&#xff0c;使用kubeadm搭建可以很简单差不多两条命令就行&#xff0c;也可以稍微复杂一点做一些基础优化&#xff0c;本文将…...

SpringBoot 快速实现 IP 地址解析

在spring boot 项目中获取请求的ip与详细地址&#xff0c;很多网站app 中都已经新增了ip 地址显示&#xff0c;大家也可以用在自己的开发中&#xff0c;显得更高级。 引入 如果使用本地ip 解析的话&#xff0c;我们将会借助ip2region&#xff0c;该项目维护了一份较为详细的本…...

【云原生】Docker镜像的创建,Dockerfile

一、Docker镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web centos:7 /bin/…...

了解Unity编辑器之组件篇Event(七)

Event&#xff1a;用于在对象之间进行通信和交互的机制。它可以帮助你实现触发和响应特定动作或状态的逻辑一、Event System&#xff1a;用于处理 UI 事件的系统组件 First Selected 属性&#xff1a;定义了在场景加载或 UI 激活时&#xff0c;哪个 UI 元素将成为首选的选中元素…...

bash: 睡觉的冒号;是不是两个点?

文章目录 简介躺着的冒号是两个点正常冒号总结简介 在bash里冒号和躺着的冒号的用法不一样一定要注意别用错。 躺着的冒号是两个点 难道正常的不是两个点)的作用: A sequence expression takes the form {x…y[…incr]}, where x and y are either integers or single cha…...

揭秘爱数AnyShare认知助手:大模型深度产品化,深化人与机器的“分工协作”

文 | 智能相对论 作者 | 叶远风 大模型竞逐日趋白热化&#xff0c;百模大战热闹非凡。 但是&#xff0c;对产业主体或者普通看客而言&#xff0c;大模型究竟如何改变一线业务、实现工作方式的变革甚至组织转型&#xff0c;很多人并没有具象化的认知。 技术厉害、产品牛&…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...