当前位置: 首页 > 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;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件&#xff0c;主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理&#xff1a; 一、超载保护装置&#xff08;核心安全装置&#xff09; 1. 起重量限制器 功能&#xff1a;实时监测起升载荷&a…...