java-线程-生产者-消费者

概述

在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
wait() / notify()方法
await() / signal()方法
BlockingQueue阻塞队列方法
PipedInputStream / PipedOutputStream

wait() / notify()方法

public class Storage {private final int MAX_SIZE = 100;private LinkedList<Object> list = new LinkedList<>();private synchronized void produce(String producer) {while (list.size() >= MAX_SIZE) {System.out.println("仓库已满,【" + producer + "】: 暂时不能执行生产任务!");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}list.add(new Object());this.notifyAll();}private synchronized void consume(String consumer) {while (list.size() == 0) {System.out.println("仓库已空,【" + consumer + "】: 暂时不能执行消费任务!");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}list.remove();this.notifyAll();}
}public class Producer extends Thread {private String producer;private Storage storage;public Producer(Storage storage) {this.storage = storage;}@Overridepublic void run() {while (true) {produce(producer);}}public void produce(String producer) {storage.produce(producer);}public String getProducer() {return producer;}public void setProducer(String producer) {this.producer = producer;}public Storage getStorage() {return storage;}public void setStorage(Storage storage) {this.storage = storage;}}public class Consumer extends Thread {private String consumer;private Storage storage;public Consumer(Storage storage) {this.storage = storage;}@Overridepublic void run() {while (true) {consume(consumer);}}public void consume(String consumer) {storage.consume(consumer);}public Storage getStorage() {return storage;}public void setStorage(Storage storage) {this.storage = storage;}public String getConsumer() {return consumer;}public void setConsumer(String consumer) {this.consumer = consumer;}}

await() / signal()方法

public class StorageLock {private Lock lock = new ReentrantLock();private Condition fullCondition = lock.newCondition();private Condition emptyCondition = lock.newCondition();private final int MAX_SIZE = 10;private LinkedList<Object> list = new LinkedList<>();public void produce(String name) {try {lock.lock();while (list.size() == MAX_SIZE) {fullCondition.await();System.out.println("仓库已满," + name + "暂停生产");}list.add(new Object());System.out.println(name + "生产一个,当前仓库容量" + list.size());emptyCondition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void consume(String name) {try {lock.lock();while (list.size() == 0) {emptyCondition.await();System.out.println("仓库以空," + name + "暂停消费");}list.remove();System.out.println(name + "消费一个,当前仓库容量" + list.size());fullCondition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

BlockingQueue阻塞队列方法


public class BlockStorage {private final int MAX_SIZE = 10;private ArrayBlockingQueue<Object> list = new ArrayBlockingQueue<Object>(MAX_SIZE);public void produce(String name) throws InterruptedException {if(list.size() == MAX_SIZE){System.out.println("仓库已满,【" + name + "】: 暂时不能执行生产任务!");}list.put(new Object());System.out.println("【" + name + "】:生产了一个产品\t【现仓储量为】:" + list.size());}public void consume(String name) throws InterruptedException {if(list.size() == 0){System.out.println("仓库空,【" + name + "】: 暂时不能执行消费任务!");}list.take();System.out.println("【" + name + "】:消费了一个产品\t【现仓储量为】:" + list.size());}}

转载于:https://www.cnblogs.com/xckxue/p/8745124.html

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

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

相关文章

如何用python做计算软件_如何用Python写一个计算器软件 附带效果图

1 import tkinter #导入tkinter模块23 root tkinter.Tk()4 root.minsize(280,500)5 root.title(李蛟龙的计算器)678 #1.界面布局9 #显示面板10 result tkinter.StringVar()11 result.set(0) #显示面板显示结果1&#xff0c;用于显示默认数字012 result2 tkinter.StringVar() #…

BI之报表测试总结

报表测试总结: 1、测试准备工作&#xff1a; 数据准备 保证足够多的有效数据 清楚报表中涉及到的算法、公式 清楚业务功能接口 2、报表测试点 基本测试点&#xff1a;界面、控件、格式、布局、明显的数据错误、js报错、报表标题&#xff0c;报表整体风格&#xff0c;翻页&#…

经由因果分析,反驳AI监控学生上课,及辨别健康类谣言

来源&#xff1a;混沌巡洋舰想象这样一个场景&#xff0c;你和你心爱的女孩一起自习&#xff0c;你的理科好&#xff0c;于是你看着她听数学的网课时&#xff0c;有时露出困惑的表情&#xff0c;还有时会走神。然后等她听完&#xff0c;你再把你觉得她没有听懂的部分&#xff0…

python 连续三个数满足条件_计算满足条件的连续值数(Pandas Dataframe)

这是一个带有^{}-# https://stackoverflow.com/a/52718782/ Divakardef maxisland_start_len_mask(a, fillna_index -1, fillna_len 0):# a is a boolean arraypad np.zeros(a.shape[1],dtypebool)mask np.vstack((pad, a, pad))mask_step mask[1:] ! mask[:-1]idx np.fl…

java controller json_springMVC的controller层接收前端json数据

1.前端的操作&#xff1a;对象接收json数据方式&#xff1a;将所需要传的数据转化为json数据&#xff0c;并将这些数据以post方式传到后台的controller层&#xff0c;然后controller层接收json数据&#xff0c;并且是以对象的形式进行接收。这里面是springmvc自动控制将这些数据…

里程碑!SpaceX 载人首飞发射成功,马斯克填补美国载人飞行近十年空白

来源&#xff1a;雷锋网作者 | 付静1 代表着首次&#xff0c;标志着政府与企业持续合作前往国际空间站的开始。终于&#xff0c;美国太空探索技术公司&#xff08;SpaceX&#xff09;的首次正式载人飞行任务拉开大幕&#xff01;美东时间 2020 年 11 月 15 日 19 时 27 分&…

【树状数组】CF961E Tufurama

挺巧妙的数据结构题&#xff08;不过据说这是一种套路&#xff1f; E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series "Tufurama". He was pretty surprised when he got results only for season 7 episod…

取文字_把这4个字母输入word,会得到一段神秘文字,承载着一段历史

在英文的输入状态下&#xff0c;把“ rand()”输入word后&#xff0c;按下回车键&#xff0c;就会突然跳出一页文字把“ rand()”输入excel后&#xff0c;按下回车键&#xff0c;则会得到这样的结果&#xff0c;0.134582最后再把“ rand()”输入PPT&#xff0c;按下回车键&…

一文看懂数字孪生,工信部权威白皮书

来源&#xff1a;智东西11月11日消息&#xff0c;《由商务部、科技部、工信部、国家发改委、农业农村部、国家知识产权局、中国科学院、中国工程院等部委和深圳市人民政府共同举办的中国国际高新技术成果交易会正式开幕。作为大会主会场的重要组成部分&#xff0c;由工信部下属…

linux -- control service and daemon process

linux -- control service and daemon process 一、几个重要概念的讲解 1、systemd 系统启动和服务器进程由 systemd 系统和服务管理器进行管理 此程序提供一种方式&#xff0c;可以在启动时和运行中的系统上激活系统资源、服务器守护进程和其他进程 2、守护进程 守护进程是在执…

java 网页正文抽取算法_网页正文抽取算法 ContentExtractor

软件介绍简介ContentExtractor 是一个开源的网页正文抽取工具&#xff0c;用JAVA实现&#xff0c;具有非常高的抽取精度。算法ContentExtractor的网页正文抽取算法使用的是CEPR&#xff0c;适用于几乎所有的包含正文的网页。 算法简介&#xff1a;项目地址转移项目已和WebColle…

基于人工智能智商研究的智能定律初探

什么是智能和意识一直是智能科学领域最基础也是最具有争议的问题&#xff0c;2014年以来&#xff0c;我们在对人机通用智能发展水平的进行研究时提出了标准智能模型&#xff0c;统一描述人和智能机器的特征。在这个研究的基础上&#xff0c;2020年5月我们在《Annals of Data》发…

Postman----Presets(预先设置)的使用

使用场景&#xff1a; 当我们在进行接口测试post请求时&#xff0c;headers是必填项&#xff0c;我们将一个A接口的headers编写后测试完成&#xff0c;再次进行B接口的测试&#xff0c;需重新编写headers&#xff0c;为了简单操作&#xff0c;我们就用到了Presets。 Presets 作…

opengl 如何加阴影_OpenGL + Qt: 3 - 旋转动画和键盘操纵

前三篇链接&#xff1a;OpenGL Qt: 0 - 三角形绘制 OpenGL Qt: 1 - 用下拉框选颜色 OpenGL Qt: 2 - 走向3D&#xff0c;画正四面体 这一周笔者经历了漫长的洲际飞行和昏天黑地的倒时差&#xff0c;所以本篇内容相对少一些&#xff0c;侧重 Qt 而不是 OpenGL。在上一篇中&…

mybatis java类注解式_Spring整合Mybatis注解方式

Spring整合Mybatis(注解方式)环境准备jar包&#xff1a;Spring所需依赖&#xff1a;spring-context、spring-aspects、aspectjrt、aspectjweaver、spring-tx、spring-jdbcmybatis所需要&#xff1a;mybatis、mybatis-spring、mysql-connector-java、(druid、c3p0、HikariCP)辅助…

2020十大新兴技术揭晓!每一项都可能颠覆我们的生活

转自丨科技日报作者丨张佳欣编辑丨翟丽影全世界都在竞相研发新冠肺炎疫苗&#xff0c;前景令人鼓舞&#xff0c;我们可能会在破纪录的时间内研发出疫苗。但在未来新冠疫情仍在蔓延的情况下&#xff0c;技术能帮助我们更快地实现目标吗?世界经济论坛和《科学美国人》杂志本月10…

c#_导出table功能

一&#xff1a;第一张导出方法&#xff0c;简单快捷 请注意&#xff1a;一般表格都有真分页&#xff0c;查询数据时候注意把分页条件去掉#region 此处是获取的list数组 然后转table再调用ExportExcel var list"你的list数据库源"DataTable dt new DataTable();dt.…

java 协议处理器_协议处理器urlstreamhandler及contenthandler

先看段打开网页的代码&#xff1a;URL urlnew URL("http://souljava.blog.163.com/");URLConnection connectionurl.openConnection();connection.getInputStream();问题1&#xff1a;客户端浏览器怎么判断接受到的是什么数据类型&#xff1f;回答&#xff1a;java的…

自己做一个小项目python_【Python】第一个微信小项目

一、微信好友数据分析功能介绍1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式2.统计好友的地域分布&#xff0c;并且做成词云和可视化展示在地图上3.获取所有好友的头像&#xff0c;合并成一张大图二、需要的库1、Pyecharts&#xff1a;一个用于生成ech…

RISC-V的自定义CPU悖论

来源&#xff1a;内容编译自「eejournal」&#xff0c;谢谢。随着这些年的发展&#xff0c;RISC-V的受重视程度与与日俱增。这主要因为它是免费的、灵活的&#xff0c;并且速度很快。这使RISC-V成为许多开发人员的安全便捷选择。但是您会认为RISC-V是通用RISC处理器还是定制的随…