Java并发-多线程售票案例

news/2024/5/3 1:23:23/文章来源:https://blog.csdn.net/abc123mma/article/details/128085609

1. 前言

本节内容主要是使用 Java 的使用 Condition 和 Lock 机制对多线程售票案例进行实现。售票案例多数情况下主要关注多线程如何安全的减少库存,也就是剩余的票数,当票数为 0 时,停止减少库存。

2. 售票机制模型

如下图所示,有两个售票窗口进行售票,有一个窗口处理退票,这既是现实生活中一个简单的售票机制。

场景设计

  • 创建一个工厂类 TicketCenter,该类包含两个方法,saleRollback 退票方法和 sale 售票方法;
  • 定义一个车票总数等于 10 ,为了方便观察结果,设置为 10。学习者也可自行选择数量;
  • 对于 saleRollback 方法,当发生退票时,通知售票窗口继续售卖车票;
  • 对 saleRollback 进行特别设置,每隔 5000 毫秒退回一张车票;
  • 对于 sale 方法,只要有车票就进行售卖。为了更便于观察结果,每卖出一张车票,sleep 2000 毫秒;
  • 创建一个测试类,main 函数中创建 2 个售票窗口和 1 个退票窗口,运行程序进行结果观察。
  • 修改 saleRollback 退票时间,每隔 25 秒退回一张车票;
  • 再次运行程序并观察结果。
public class DemoTest {public static void main(String[] args) {TicketCenter ticketCenter = new TicketCenter();new Thread(new saleRollback(ticketCenter),"退票窗口"). start();new Thread(new Consumer(ticketCenter),"1号售票窗口"). start();new Thread(new Consumer(ticketCenter),"2号售票窗口"). start();}
}class TicketCenter {private int capacity = 10; // 根据需求:定义10涨车票private Lock lock = new ReentrantLock(false);private Condition saleLock = lock.newCondition();// 根据需求:saleRollback 方法创建,为退票使用public void saleRollback() {try {lock.lock();capacity++;System.out.println("线程("+Thread.currentThread().getName() + ")发生退票。" + "当前剩余票数"+capacity+"个");saleLock.signalAll(); //发生退票,通知售票窗口进行售票} finally {lock.unlock();}}// 根据需求:sale 方法创建public void sale() {try {lock.lock();while (capacity==0) { //没有票的情况下,停止售票try {System.out.println("警告:线程("+Thread.currentThread().getName() + ")准备售票,但当前没有剩余车票");saleLock.await(); //剩余票数为 0 ,无法售卖,进入 wait} catch (InterruptedException e) {e.printStackTrace();}}capacity-- ; //如果有票,则售卖 -1System.out.println("线程("+Thread.currentThread().getName() + ")售出一张票。" + "当前剩余票数"+capacity+"个");} finally {lock.unlock();}}
}class saleRollback implements Runnable {private TicketCenter TicketCenter; //关联工厂类,调用 saleRollback 方法public saleRollback(TicketCenter TicketCenter) {this.TicketCenter = TicketCenter;}public void run() {while (true) {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}TicketCenter.saleRollback(); //根据需求 ,调用 TicketCenter 的 saleRollback 方法}}
}
class Consumer implements Runnable {private TicketCenter TicketCenter;public Consumer(TicketCenter TicketCenter) {this.TicketCenter = TicketCenter;}public void run() {while (true) {TicketCenter.sale(); //调用sale 方法try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

总结:售票机制与生产者 - 消费者模式存在着细微的区别,需要学习者通过代码的实现慢慢体会。由于售票方法只需要进入 await 状态,退票方法需要唤醒售票的 await 状态,因此只需要创建一个售票窗口的 Condition 对象

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

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

相关文章

ANR系列之ContentProvider类型原理讲解

前言: 众所周知,ANR一共有四种类型,如下: 1.输入事件类型ANR 2.广播类型ANR 3.ContentProvider类型ANR 4.Service类型ANR 四种类型的超时时间如下所示: 所以ANR系列文章也会分为5篇文章来进行讲解,本…

管理最忌讳用权管人

阅读本文大概需要 1.66 分钟。最近星球在更新一些系列课程,其中有一节课叫「怎样从技术人转型管理者?」应该很适合大多读者,毕竟关注我的读者里,做技术做管理的居多,所以这篇也发这里给大家分享下。程序员做技术的&…

WebView2 通过 PuppeteerSharp 实现爬取 王者 壁纸 (案例版)

王者壁纸自动化获取逻辑分析 其实它的逻辑很简单, 就是王者的官网,打开后,在右下角就看到了皮肤页面部分。 这个时候,点击更多,就会打开全部英雄详情的页面。 这个时候,单点任意一个英雄,就会…

Rust机器学习之Linfa

Rust机器学习之Linfa 众所周知,Python之所以能成为机器学习的首选语言,与其丰富易用的库有很大关系。某种程度上可以说是诸如numpy、pandas、scikit-learn、matplotlib、pytorch、networks…等一系列科学计算和机器学习库成就了Python今天编程语言霸主的…

DDOS防护如何建设?

数字化转型发展也推动了云计算、人工智能、大数据、物联网等新一代信息技术应用普及,与此同时,新时代的发展也带来了新的网络威胁和新的安全需求。我们不难发现,近年网络攻击时间层出不穷,全球范围来看,企业因遭受网络…

CrossOver软件2022可以使苹果MAC电脑运行Windows软件应用

面对安装双系统时的繁琐步骤,以及虚拟机软件那庞大的体积,CrossOver的出现,让一切都变得简单起来。 CrossOver自带的一系列的Windows应用,涵盖游戏软件、办公软件、设计软件等多个种类。它轻巧的体积,便捷的操作步骤无…

国鸿氢能冲刺港股:年亏损7亿 云浮工业园与青岛城投是股东

雷递网 雷建平 11月28日国鸿氢能科技(嘉兴)股份有限公司(简称:“国鸿氢能”)日前递交招股书,准备在港交所上市。年亏损7亿国鸿氢能成立于2015年6月,是一家以氢燃料电池为核心产品的企业&#x…

字符串压缩(二)之LZ4

一、LZ4压缩与解压 LZ4有两个压缩函数。默认压缩函数原型: int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); 快速压缩函数原型: int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapaci…

如何用潜类别混合效应模型(Latent Class Mixed Model ,LCMM)分析老年痴呆年龄数据

全文下载链接:http://tecdat.cn/?p24647线性混合模型假设 N 个受试者的群体是同质的,并且在群体水平上由独特的曲线 Xi(t)β 描述(点击文末“阅读原文”获取完整代码数据)。相关视频背景和定义相比之下,潜在类别混合模…

【毕业设计】24-基于单片机的电子显示屏的设计与应用(原理图+源码+仿真工程+论文+答辩PPT)

【毕业设计】24-基于单片机的电子显示屏的设计与应用(原理图源码仿真工程论文答辩PPT) 文章目录任务书设计说明书摘要设计框架架构设计说明书及设计文件源码展示任务书 主要研究内容: 通过查阅资料,掌握单片机基本工作原理&#…

【STM32备忘录】二、FSMC做LCD控制器,使用stm32cube配置示例

文章目录1. FSMC框图2. 配置示例(1) cube配置(2) 代码参考*疑问1. FSMC框图 如果屏幕接口8位数据宽度访问,地址线FSMC_A[25:0], 一共26位,一个块22667108864Byte64MB,如果屏幕接口16位数据宽度访问,地址线FSMC_A[25:0], 一共26位&…

鸿蒙全量源代码在线阅读

目录 前言 下载方式复杂 占用空间大 搜索效率低 本项目目标 服务器地址 使用手册 源码浏览服务 标识符搜索 普通文本搜索 代码比较 写在最后 前言 当前,OpenHarmony项目持续发展,其代码量已经超过了20G字节的存储占用空间,对于一…

基于人工蜂群算法的线性规划求解matlab程序

基于人工蜂群算法的线性规划求解matlab程序 1 人工蜂群算法概述 2005年D. Karaboga教授仿照蜜蜂集群采蜜生物行为,提出了人工蜂群仿生算法,可以有效解决有关函数优化等相关难题。ABC算法仿照蜜蜂蜂群中不同蜂种相互协作,蜂群间进行角色转换的…

不同类型的 SSL 证书解释

了解不同类型的 SSL 证书:扩展验证 (EV)、组织验证 (OV) 和域名验证 (DV)。 查看用例及更多。 SSL/TLS 证书用于验证网站的身份并在服务器和浏览器之间创建安全连接。有许多不同类型的 SSL 证书选项可用,它们都有其独特的用例和价值主张。证书颁发机构 …

电磁仿真设计RMxprt-6p72s电励磁凸极同步电机分析案例

作者 | 电机设计青年 仿真秀专栏作者 导读:大家好,我是仿真秀专栏作者——电机设计青年,曾担任ANSYS低频电磁工程师一职,后入职电机企业,一直从事电机产品研发工作。研究的电机类型涉及电励磁同步电机、永磁同步电机、…

MIT发现语言模型内的事实知识可被修改??

文 | 小伟前言众所周知,自回归语言模型(如GPT-2)里存储着大量的事实知识,比如语言模型可以正确的预测出埃菲尔铁塔所在的城市是巴黎市。那么语言模型是在什么地方存储这些知识呢?我们是否可以修改存储在语言模型里的知识呢?来自于…

R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例

全文下载链接:http://tecdat.cn/?p21317本文提供了运行分布滞后非线性模型的示例,同时描述了预测变量和结果之间的非线性和滞后效应,这种相互关系被定义为暴露-滞后-反应关联(点击文末“阅读原文”获取完整代码数据)。…

[附源码]计算机毕业设计springboot本地助农产品销售系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

小程序上新(2022.11.15~11.28)

20221115 小程序基础库 2.27.3 更新 更新 框架 设备 VoIP 能力授权更新 框架 支持 worker 代码打包到小程序&小游戏分包 详情更新 组件 scroll-view 接近全屏尺寸时默认开启点击回到顶部更新 API createVKSession 在不需要用到摄像头的时候不再发起摄像头授权 详情修复 框…

【笔试强训】Day 4

🌈欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&#x…