程序模拟电影院窗口卖票,多线程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的票数,延迟之后输出异常,锁定线程之后就可以解决了
程序模拟电影院窗口卖票,多线程Demo相关推荐
- java 卖票问题_Java之多线程窗口卖票问题(Thread)
/** * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thread类的方式 * * 存在线程的安全问题,待解决. * */ class Window extends Thread{ pri ...
- 如何高效实现多窗口卖票
多窗口卖票是常见的多线程问题,来看看要怎么搞 方法1,不建议的使用方式 package concurrent.me.ticket;import java.util.ArrayList; import ...
- 3个窗口卖票java_三个窗口同时卖火车票,如何用代码将该场景实现?
今天是我自学Java的第33天. 感谢你的陪伴,你的陪伴便是对我最大的鼓励. 话不多说,开始今天的学习:线程同步. 想必很多小伙伴应该都经历过去火车站买票的情况. 现有一个案例:火车站有3个售票窗口, ...
- 四窗口卖票 自己的票
四窗口卖票 自己的票 卖票线程 package demon四个窗口卖票;public class TicketSale extends Thread {public TicketSale(){}pub ...
- 多线程实现多个窗口卖票问题
写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...
- 多线程卖票深刻分析:为什么会出现只有一个窗口卖票的现象
一.需求分析: 模拟卖票窗口,实现5个窗口同时卖100张票(代码为了截图采用30张票) 知识点:多线程,锁,多线程的安全问题,线程的生命周期 二.代码实现 public class TestSellT ...
- java多线程同步 多窗口卖票实例_java多线程之火车售票系统模拟实例
1.前言 为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票. 2.非同步代码 package com.tl.skyLine.thread; ...
- 多线程经典问题之多窗口卖票
2019独角兽企业重金招聘Python工程师标准>>> 需求:简单的卖票程序,要实现多个窗口同时买票. 一.方式一: 1.问题:为什么50张票被卖出了150次? 2.出现的原因 ...
- Java模拟售票窗口代码_java多线程模拟售票,多个窗口售票
package com.ma.thread001; /** * 多线程模拟售票,多个窗口售票 * @author ma * */ public class SellTicktDemo implemen ...
最新文章
- Swift3.0带来的变化汇总系列一——字符串与基本运算符中的变化
- Uva 11300 分金币
- python 习题集锦
- linux php 如何停止,如何关闭linux
- 搜索专题【2010】四2.过河问题
- 第99:真正理解拉格朗日乘子法和 KKT 条件
- .Net Core 读取文件时中文乱码问题的解决方法
- MySQL数据库同步神器 - Gravity - 比Datax好用
- 教你怎样打领带(附图)绝对实用哦!!!【实用】
- SNMP TRAP实战
- adb shell settings(系统服务:settings)
- C语言 解析lrc歌词文件
- C++后台开发面试常考
- 测试学习--云测试平台
- 科技公司逐鹿手机配件赛道,“降维打击”会出现吗?
- 系统加速比(amdahl定律)
- python合并word表格单元格_Python-Excel转word表格并合并流程
- 时钟周期,机器周期,指令周期的区别
- 【已解决】sftp命令没有反应
- rpm包制作之openssh8.7升级