/**
* 生产者消费者问题
* 思路:
* 整体分析,面向对象的思维,应该几个类
* Producer 生产者类,因为要进行加工过程,所以使用线程来进行编写
* Consumer 消费者类, 因为要实现自动消费过程,所以使用多线程完成
* Basket 箩筐类, 因为要使用该类进行存取产品,多以要对该类实现线程锁, 因为箩筐存放物品数量有限制,所以要进行处理
* SteamedBun 馒头类
*/
class TestProducerConsumer
{
public static void main(String[] args)
{
Basket basket = new Basket(10); // 创建一个存放10个馒头的箩筐
new Thread(new Producer("张三", basket)).start(); // 创建一个生产者并启动生产
new Thread(new Producer("李四", basket)).start(); // 创建一个生产者并启动生产
new Thread(new Consumer("王五", basket)).start(); // 创建一个消费者类并启动消费
new Thread(new Consumer("赵六", basket)).start(); // 创建一个消费者类并启动消费
}
}
/**
* 箩筐类
* 成员属性: 馒头数组, 指向箩筐中空位置的指针
* 成员方法: 增加馒头
* 删除馒头
*/
class Basket {
private SteamedBun[] steamedBuns;
private int index = 0;
/**
* 构造函数
* @param number 该箩筐中能够存放多少馒头
*/
public Basket(int number) {
steamedBuns = new SteamedBun[number];
}
/**
* 放入一个馒头
* @param steamedBun 要放入的一个馒头对象
* 注意:
* 1. 馒头存放数量,根据构造函数中number的值进行确定,超出后将进入休眠状态
*/
public synchronized void push(SteamedBun steamedBun) {
// index总指向存放馒头的上一个位置
while(index >= steamedBuns.length) {
try{
this.wait(); // 进入线程等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll(); // 唤醒等待的所有线程
//index ++; // 使指针自增1
System.out.print("Index = " + index);
steamedBuns[ index++ ] = steamedBun;
}
/**
* 放入一个馒头
* @param steamedBun 要放入的一个馒头对象
* 注意:
* 1. 馒头存放数量,根据构造函数中number的值进行确定,超出后将进入休眠状态
*/
public void push1(SteamedBun steamedBun) {
// index总指向存放馒头的上一个位置
synchronized (this) {
while(index >= steamedBuns.length) {
try{
this.wait(); // 进入线程等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll(); // 唤醒等待的所有线程
//index ++; // 使指针自增1
System.out.print("Index = " + index);
steamedBuns[ index++ ] = steamedBun;
}
}
/**
* 从箩筐中拿出一个馒头
* 注意:
* 如果指针指向0位置就说明没有馒头了,所以将进入休眠状态,有馒头后将会唤醒
*/
public synchronized SteamedBun pop() {
while(index <= 0) {
try{
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
return steamedBuns[--index];
}
/**
* 从箩筐中拿出一个馒头
* 注意:
* 如果指针指向0位置就说明没有馒头了,所以将进入休眠状态,有馒头后将会唤醒
*/
public SteamedBun pop1() {
synchronized (this) {
while(index <= 0) {
try{
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
return steamedBuns[ --index];
}
}
}
/**
* 馒头类
* 成员属性: 馒头的id
* 成员方法:
* 获得馒头的id
* 设置馒头的id
*/
class SteamedBun {
private int id = 0; // 每个馒头都有一个ID
public SteamedBun(int id) {
this.id = id;
}
/**
* 设置这个馒头的ID
* @param id 要设置馒头的ID
*/
public void setId(int id) {
this.id = id;
}
/**
* 获得这个馒头的ID
* @return 要获取馒头的ID
*/
public int getId() {
return this.id;
}
}
/**
* 生产者的类,详细见类内部注释
*/
class Producer implements Runnable{
private static int id; // 制作出馒头的id
private Basket basket; // 要将产品存放在哪里
/**
* 如果要将该生产者的线程停止,请设置为false
*/
public boolean flat = true;
private String name; // 生产者的姓名
/**
* 构造方法
* @param name 生产者的名字
* @param basket 产品仓库
*/
public Producer(String name, Basket basket) {
this.name = name;
this.basket = basket;
}
/**
* 线程方法
*/
public void run() {
while (flat) {
SteamedBun steamedBun = new SteamedBun(id++); // 创建一个馒头
basket.push(steamedBun); // 加入到箩筐中
System.out.println(this.name + "制作了id为" + steamedBun.getId() + "的馒头!");
}
}
}
class Consumer implements Runnable {
private Basket basket; // 从哪里拿产品
/**
* 如果要将该生产者的线程停止,请设置为false
*/
public boolean flat = true;
private String name; // 消费者的姓名
/**
* 构造方法
* @param name 消费者的名字
*/
public Consumer(String name, Basket basket) {
this.name = name;
this.basket = basket;
}
/**
* 线程方法
*/
public void run() {
while(flat) {
SteamedBun steamedBun = basket.pop(); // 从篮子中拿出一个馒头
System.out.println(this.name + "拿出了id为" + steamedBun.getId() + "的馒头!");
}
}
}相关推荐
IDEA 2023最新破解教程:从安装到永久激活(附常见问题解决方案)
本文为Java开发者提供了一份详尽的IntelliJ IDEA 2023高效使用指南。内容涵盖从版本选择、安装配置到核心快捷键、项目依赖管理、高级调试测试以及插件生态的深度优化。旨在帮助用户在合法合规的前提下,充分发挥这款顶级IDE的潜力,显著提升Java开发效率与工作体验。
创建一个数组,实现函数init()初始化数组、实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。要求:自己设计函数的参数,返回值。
//创建一个数组,实现函数init()初始化数组、实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。要求:自己设计函数的参数,返回值。 #include<stdio.h> #include<stdlib.h> #include<windows.h> void init(int arr[], int len){ for (int i = ...
SAP中贸易伙伴的应用原理简析
公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理。 如下图某贸易伙伴公司(关联方名称G0059)在我方公司的SAP系统中有多重身份(即是供应商,又是客户)。那么在我方公司SAP系统中建立起公司(贸易伙伴),并关联到供应商和客户主数据中。之后,就可以通过G0059这个贸易伙伴名称来识别与该贸易伙伴间的往来业务。 相应的配置设定如下: 定义公司(贸易伙伴或关联方) 会计凭证中会
linux第13天 生产者与消费者
pthread_cond_t my_condition = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁和条件等待 解决生产者和消费者模型 条件等待模型//socket连接池。。。。。 pthread_mutex_lock(&mutex...
QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型
常用的地图种类分为交通图,地形图,卫星图等等,在QML的Map(以OSM地图为例)中提供activeMapType属性用于读取当前显示的地图类型(注意:该属性为只读属性,不能用于赋值),QML中地图的加载寻找根据瓦片的文件名进行查找,例如名为"osm_100-l-5-2-2-3.png"的瓦片,其中5代表了该地图的类型
AxMath行间公式转化为office公式求和符号以及编号显示问题
AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai+bi2比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中
操作系统中关于信号量操作的代码示例(Linux + windows)
有一个生产者进程,有两个消费者进程。生产者产生1-100的100个数。两个消费者从共享内存中取数。/*windows 部分*/// Thread.cpp : 定义控制台应用程序的入口点。//-----------Windows下生产者、消费者实例程序---------------------//--------------author:zhangwei-----------------------
MATLAB库函数unwrap(相位解卷绕)的C语言实现
什么是相位解卷绕 Q = unwrap(P) Q = unwrap(P) corrects the radian phase angles in a vector P by adding multiples of ±2π when absolute jumps between consecutive elements of P are greater than or equal to the default jump tolerance of π radians. If P is a matrix, unw
一个生产者多个消费者问题
问题描述:一个缓冲区具有多个消费者和一个生产者,生产者往缓冲区中顺序写数据,每个消费者首先访问最新被写缓冲,然后顺序访问。
基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统
基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统
Android车载音频系统概览
官网有些部分的内容描述比较简单,对没有app、系统和底层开发经验,容易一眼扫过,没有留意到相关细节。 本节补充车载音频相关细节。
Linux 中生产者与消费者问题
条件变量Condition Variable 一个Condition Variable总是和一个Mutex搭配使用的。一个线程可以调用pthread_cond_wait在一个Condition Variable上阻塞等待,这个函数做以下三步操作: 释放Mutex(不满足条件时必须进行休眠)进行阻塞式等待(不能抱着锁资源休眠)被唤醒时能够重新获得Mutex资源并等待(能被唤醒) 基
一文整理深度学习【深度学习linux的docker+pytorch+cuda+nvidia-docker+vscode配置】
docker+pytorch+cuda+nvidia-docker+vscode
经典同步问题一——生产者和消费者问题
不懂得结构型信号量的小伙伴可参考下面博文,之后再阅读本博文,更易于理解 https://blog.youkuaiyun.com/weixin_36465540/article/details/105559848 生产者和消费者问题 问题描述 一个或多个生产者产生数据并放在缓冲区中,每次一个。 一个或多个消费者从缓冲区取数据项并消费,每次一个。 条件: 1 在任意时间只能一个生产者或消费者访问缓冲区——互斥 2...
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
【Linux】生产者和消费者问题
aaaa
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
生产者和消费者问题
生产者和消费者问题 一、维基百科 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消...
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
基于linux下的消费者和生产者问题(c语言)
“生产者—消费者”问题描述如下: 有一个有限缓冲区和两个线程:生产者和消费者。他们分别不停地把产品放入缓冲区和从缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。 这里要求使用有名管道来模拟有限缓冲区,并且使用信号量来解决“生产者—消费者”问题中的同步和互斥问题。 所需头文件: #include <stdio.h> #include <stdlib.h> #include <
进程与线程之生产者和消费者问题
在学习进程和线程的过程中,毫无疑问肯定会学到多线程、进程间通信等相关问题。而这也是学习进程和多线程方面的一个重点。这篇文章主要介绍的是利用互斥量、锁以及使用Pthread库来实现生产者和消费者问题。1、临界区 临界区指的是共享内存进行访问的程序片段。在实现线程间同步就必须只有一个线程访问临界区。上图中进程A在T1时刻进入临界区,当运行到T2时刻的时候进程B试图进入临界区。因为此时进程...
java生产者消费者流程图_用java实现生产者和消费者问题
实验一生产者和消费者问题一、实验目的和要求1)、通过编写程序,掌握基本的同步互斥算法,理解生产者和消费者模型。2)、了解多线程并发执行机制,线程间的同步和互斥。3)、学习使用同步对象,掌握相应的API。二、实验主要内容编写基础的生产者消费者程序,程序反映了生产者和消费者的工作过程,其中缓冲区只存放一类产品,生产者消费者只对一类产品进行操作。1、创建生产者和消费者线程2、生产和消费规则①系统中有多...
模拟生产者-消费者问题和读者-写者问题
一组生产者进程生产产品给一组消费者进程消费。一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得。生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,in加1;用一个输出指针out来指示下一个可从中获取产品的缓冲区,
进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者
问题描述:一组生产者进程和一组消费者进程共享一个初始为空、大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。分析:关系分析:生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费...
3366



被折叠的 条评论
为什么被折叠?



