程序模拟电影院窗口卖票,多线程Demo
某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
卖电影票Demo
- 实现步骤
- 1.SellTicket类
- 2.SellTicketDemo测试类
- 3.测试结果
- 4.问题反思
- 4.1 相同的票出现了多次
- 4.2 出现了负数的票
实现步骤
1. 定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;2. 在SellTicket类中重写run()方法实现卖票,代码步骤如下:判断票数大于0,就卖票,并告知是哪个窗口卖的卖了票之后,总票数要减1票没有了,也可能有人来问,所以这里用死循环让卖票的动作一直执行3. 定义一个测试类SellTicketDemo,里面有main方法,代码步骤如下:创建SellTicket类的对象创建三个Thread类的对象,把SellTicket对象作为构造方法的参数,并给出对应的窗口名称4. 启动线程
1.SellTicket类
package king03;// 定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;public class SellTicket implements Runnable {private int tickets = 100;private Object obj = new Object();// 在SellTicket类中重写run()方法实现卖票,代码步骤如下:@Overridepublic void run() {while (true) {
// 使用 synchronized同步代码块 锁定 线程只能同时一个线程运行synchronized (obj) {if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}}/*
// 相同的票出现了多次while (true) {if (tickets > 0) {
// 通过Sleep()方法来模拟出票时间try {Thread.sleep(100);
// t1线程休息100毫秒
// t2线程抢到了CPU的执行权,t2线程就要开始执行,执行到这里的时候,t2线程休息100毫秒
// t3线程抢到了CPU的执行权,t3线程就要开始执行,执行到这里的时候,t3线程休息100毫秒} catch (InterruptedException e) {e.printStackTrace();}
// 假设线程按照顺序醒过来
// t1抢到CPU的执行权,在控制台输出:窗口1正在出售第100张票System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// t2抢到CPU的执行权,在控制台输出:窗口2正在出售第100张票
// t3抢到CPU的执行权,在控制台输出:窗口3正在出售第100张票tickets--;
// 如果这三个线程还是按照顺序来,这里就执行了3次(--)操作,最终票就变成了97}}*//*
// 出现了负数的票while (true) {
// tickets=1
// t1,t2,t3
// 假设t1线程抢到CPU的执行权if (tickets > 0) {
// 通过Sleep()方法来模拟出票时间try {Thread.sleep(100);
// t1线程休息100毫秒
// t2线程抢到了CPU的执行权,t2线程就要开始执行,执行到这里的时候,t2线程休息100毫秒
// t3线程抢到了CPU的执行权,t3线程就要开始执行,执行到这里的时候,t3线程休息100毫秒} catch (InterruptedException e) {e.printStackTrace();}
// 假设线程按照顺序醒过来
// t1抢到CPU的执行权,在控制台输出:窗口1正在出售第1张票
// 假设t1继续拥有CPU的执行权,就会执行tickets--;操作,tickets=0;// t2抢到CPU的执行权,在控制台输出:窗口2正在出售第0张票
// 假设t2继续拥有CPU的执行权,就会执行tickets--;操作,tickets=-1;// t3抢到CPU的执行权,在控制台输出:窗口3正在出售第-1张票
// 假设t3继续拥有CPU的执行权,就会执行tickets--;操作,tickets=-2;System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");tickets--;}}*/}
}
2.SellTicketDemo测试类
package king03;public class SellTicketDemo {public static void main(String[] args) {SellTicket st = new SellTicket();// 创建三个Thread类的对象,把SellTicket对象作为构造方法的参数,并给出对应的窗口名称Thread t1 = new Thread(st, "窗口1");Thread t2 = new Thread(st, "窗口2");Thread t3 = new Thread(st, "窗口3");// 启动线程t1.start();t2.start();t3.start();}}
3.测试结果
从100张一直售卖完最后一张,没有全部截图
4.问题反思
4.1 相同的票出现了多次
最终分析是因为线程执行的随机性导致的,三个线程先后启动,但是都是在执行同一个操作,造成了一张票同时在3个窗口都卖出去了。
解决办法: 使用synchronized同步代码块锁定,使只能同时一个线程运行,这样就可以避免出现这个问题
4.2 出现了负数的票
依旧是线程的问题,在三个线程先后抢到CPU的执行权的时候,都会执行ticket--
的操作,使之输出了-1的票数,延迟之后输出异常,锁定线程之后就可以解决了
相关文章:

(C#加密)幻术-大踲无形
首先:我看下面的代码只是知道大概的原理核心算法还是不太清楚~~有清楚的麻烦回复下谢谢咯咯--这也是看Msdn就是把在一个图片上隐藏数据 usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Data;usin…

01 python爬虫
--- 转载于:https://www.cnblogs.com/haima/p/10107708.html

【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
【BZOJ3963】[WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器。原来的那一台生产机器已经坏了,所以你要去为公司买一台新的生产机器。你的任务是在转型期…

金山发布《2006年度信息安全报告》
2006年度,国内的互联网环境因接踵而至的信息安全事件一再掀起了波澜。作为国内领先的信息安全厂商,金山毒霸同数千万国内用户一起见证了对病毒、对流氓软件发出的各种绝技杀手锏。 2007年2月8日,金山软件正式发布了《中国互联网2006年度信息安…

Nginx+Apache Yii2.0 配置方案
最近用Yii2.0框架做了个小项目,虽然项目本身业务逻辑不复杂,但是由于本身业务逻辑的特殊性,在上午9点到12点之间系统访问量会突然上升(浏览量和用户上传文件量)。导致系统单纯的部署在Apache下,支撑不了这么…

RobotFramework下的http接口自动化Set Request Body 关键字的使用
Set Request Body关键字用来设置http 请求时的body 信息,尤其是在post 请求时,经常需要用到这个关键字。 该关键字接收一个参数,[ body ] 示例1:登录博客园(http://www.cnblogs.com/)时,设置登录…

JDK11使用IDEA,配置JavaFX
JDK11使用IDEA,配置JavaFX1.下载javaFX相关的包2.在实际Demo中试验哪里少了添加哪里导入lib文件夹,之后点击OK配置VMoption配置成功3.运行,大功告成1.下载javaFX相关的包 需要下载对应的包,进入openjfx.cn网站下载 https://gluon…

写了一个PPT,用于公司内部培训
匆忙写成,以后会慢慢补充请用力一击中等规模的并发程序设计http://files.cnblogs.com/jobs/2007-5-9-concurrent-ppt.rar2007-5-10修改版(带参考文档)http://files.cnblogs.com/jobs/2007-5-10-concurrent-ppt.rar转载于:https://www.cnblogs…

终端bash美化(FC)
终端bash美化(FC) 用Linux也已经一年多了,感觉几乎还是什么都不会。大概是一直再做一些没多大意义的事的缘故吧,就像今天些的内容一样。以前搞了一段时间的GENTOO,发现里面的bash提示(也就是[userhostname directory]$…
List and ArrayList
List<> and ArrayList Class DiagramsUsing the Bit Complement of the BinarySearch() Result代码1using System; 2using System.Collections.Generic; 3class Program 4{ 5 static void Main() 6 { 7 List<string> list new List<string>();…

spring boot jpa 整合
1,Eclipse JPA Tool配置 https://www.cnblogs.com/wgslucky/p/10109300.html 2,项目地址 https://gitee.com/wgslucky/springboot-jpa 转载于:https://www.cnblogs.com/wgslucky/p/10109869.html

安装JDK1.8+环境配置
安装JDK1.8环境配置1.下载JDK2.安装JDK3.环境配置3.1 新建系统变量3.2 添加Path路径3.3 使用cmd命令行验证是否环境配置成功1.下载JDK 直接官网下载:http://www.oracle.com 下载链接https://www.oracle.com/java/technologies/javase-downloads.html#JDK8 选择自己…

Nodejs.热部署方法
在开发中我们修改了一点代码后要去重启服务器才能看到结果,为了省去这个过程我们以往经常使用热部署代码的方法 下面是使用“supervisor”来达到热部署能力的方法: sudo npm install -g supervisor #安装 supervisor app.js #启动 如果碰到如下提示, 则表示路径没…

SortedList 泛型类
SortedList 泛型类 请参见 示例 成员 全部折叠 全部展开 语言筛选器: 全部 语言筛选器: 多个 语言筛选器: Visual Basic 语言筛选器: C# 语言筛选器: C语言筛选器: J# 语言筛选器: JScri…

中国现代化进程专题讲座——有感
最近有上段治文老师的中国现代化进程这门课,感觉受益颇多。 从国外到国内,从古代到如今,讲论点、论据,评论历史人物、历史事件,讲的很宏大,很深刻。我并没有特意捧他,而是深深被其思想的深刻、言…

java运行出现JNI错误,JDK8和JDK11都安装了
java运行出现JNI错误,JDK8和JDK11都安装了1. 问题描述2. 尝试办法3. 解决办法3.1 解决方法:3.2 测试结果成功1. 问题描述 因为编程的需要,所以我安装了JDK8和JDK11,在安装好了之后配置好了环境变量,之后打开Eclipse的…

爱不释手(Typingfaster)1.78beta,重大升级,欢迎试用,期待反馈。
爱不释手1.78测试版主要有以下改进:1、改进内核,大幅度提高了屏显速度;2、增加文章分段显示功能;3、增加每秒按键次数统计;4、测试结果中划分了实际速度与名义速度,即实际速度=名义速度准确率&a…

php 网站内容采集器 Snoopy
Snoopy转载于:https://www.cnblogs.com/buxiangxin/p/7245580.html

[转]笑话: 耐力惊人的三只乌龟
某日,龟爸、龟妈、龟儿子三只乌龟,决议去郊游。带了一个山东大饼,和两罐海底鸡出发到XX山去。 苦爬十年,终於到了。席地而坐,卸下装备,准备进食。****~~~该死!!没带开罐器࿰…

如何解决代码中if…else 过多的问题
前言 if...else 是所有高级编程语言都有的必备功能。但现实中的代码往往存在着过多的 if...else。虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性、可维护性造成很大伤害,进而危害到整个软件系统。现在软件开发领域出现了很多新技术、新概念…

Facial keypoints detection Kaggle 竞赛系列
3.2# Facial keypoints detection 作者:Stu. RuiQQ: 1026163725原文链接:http://blog.csdn.net/i_love_home/article/details/51051888该题主要任务是检測面部关键点位置 Detect the location of keypoints on face images 问题表述 在本问题中。要求计算…

Error:java: 无效的源发行版: 11
Error:java: 无效的源发行版: 111.问题描述2.原因查找3.解决办法3.1 打开IDEA的File—Project Structure设置3.2 修改Project SDK为自己想要切换的版本3.3 修改project languang level1.问题描述 在我的电脑中同时安装了JDK8和JDK11,之前本来调试好了的,…

今天看论坛,有这样一句话,深有同感,还是家里好
就像孟宣后来对这个城市的评价:“这里的人活的才像人……就像那么发达国家的小城市,不用背负那么大的生存压力。在北京,如果你每天生活要30个馒头,那么你要挣到200到300个。而在这里,只需要30个馒头就可以了……”转载…

面对别人强行关机你怎么办与 定时关机
面对这个图你的第一感觉是什么?肯定是有人.....那你怎么办呢?让它继续下去!不能绝对不能!以前比较幸运的打开了几个记事本没有保存逃过了一关,可是屡试不爽呐!直到我同学出现这种情况时,幸亏我眼快,呵呵 所以问他一下!知道了这个玩意出来的命令是在运行里敲入shutdown -s如果…

iOS开发实战-基于SpriteKit的FlappyBird小游戏
写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的2D游戏框架。它支持2D游戏中各种功能,如物理引擎,地图编辑,粒子࿰…

2018年12月14日 函数 总结
map() 处理序列中每个元素,得到迭代器,该迭代器 元素个数和位置与原来一致 filter() 遍历序列中的每个元素,判断每个元素得到布尔值,如果是true则留下来 people[{name:"abc","age":100},{"name":&…

UML类图新手入门级介绍
UML类图新手入门级介绍 看了大话设计模式,觉得很生动形象,比较适合于我这种初学者理解面向对象,所以就记录了一下。 举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法。 首先,看动物矩形…

SQL中获取刚插入记录时对应的自增列的值
--创建数据库和表create database MyDataBaseuse MyDataBasecreate table mytable(id int identity(1,1),name varchar(20))--执行这个SQL,就能查出来刚插入记录对应的自增列的值insert into mytable values(李四)select identity转载于:https://www.cnblogs.com/bnjbl/archive…
SQL Server开发人员应聘常被问的问题妙解汇总
目前在职场中很难找到非常合格的数据库开发人员。我的一个同事曾经说过:“SQL开发是一门语言,它很容易学,但是很难掌握。” 在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰…

little w and Soda(思维题)
链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 不知道你听没听说过这样一个脑筋急…