某电影院目前正在上映国产大片,共有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相关推荐

  1. java 卖票问题_Java之多线程窗口卖票问题(Thread)

    /** * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thread类的方式 * * 存在线程的安全问题,待解决. * */ class Window extends Thread{ pri ...

  2. 如何高效实现多窗口卖票

    多窗口卖票是常见的多线程问题,来看看要怎么搞 方法1,不建议的使用方式 package concurrent.me.ticket;import java.util.ArrayList; import ...

  3. 3个窗口卖票java_三个窗口同时卖火车票,如何用代码将该场景实现?

    今天是我自学Java的第33天. 感谢你的陪伴,你的陪伴便是对我最大的鼓励. 话不多说,开始今天的学习:线程同步. 想必很多小伙伴应该都经历过去火车站买票的情况. 现有一个案例:火车站有3个售票窗口, ...

  4. 四窗口卖票 自己的票

    四窗口卖票 自己的票 卖票线程 package demon四个窗口卖票;public class TicketSale extends Thread {public TicketSale(){}pub ...

  5. 多线程实现多个窗口卖票问题

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  6. 多线程卖票深刻分析:为什么会出现只有一个窗口卖票的现象

    一.需求分析: 模拟卖票窗口,实现5个窗口同时卖100张票(代码为了截图采用30张票) 知识点:多线程,锁,多线程的安全问题,线程的生命周期 二.代码实现 public class TestSellT ...

  7. java多线程同步 多窗口卖票实例_java多线程之火车售票系统模拟实例

    1.前言 为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票. 2.非同步代码 package com.tl.skyLine.thread; ...

  8. 多线程经典问题之多窗口卖票

    2019独角兽企业重金招聘Python工程师标准>>> 需求:简单的卖票程序,要实现多个窗口同时买票.  一.方式一:  1.问题:为什么50张票被卖出了150次?  2.出现的原因 ...

  9. Java模拟售票窗口代码_java多线程模拟售票,多个窗口售票

    package com.ma.thread001; /** * 多线程模拟售票,多个窗口售票 * @author ma * */ public class SellTicktDemo implemen ...

最新文章

  1. Swift3.0带来的变化汇总系列一——字符串与基本运算符中的变化
  2. Uva 11300 分金币
  3. python 习题集锦
  4. linux php 如何停止,如何关闭linux
  5. 搜索专题【2010】四2.过河问题
  6. 第99:真正理解拉格朗日乘子法和 KKT 条件
  7. .Net Core 读取文件时中文乱码问题的解决方法
  8. MySQL数据库同步神器 - Gravity - 比Datax好用
  9. 教你怎样打领带(附图)绝对实用哦!!!【实用】
  10. SNMP TRAP实战
  11. adb shell settings(系统服务:settings)
  12. C语言 解析lrc歌词文件
  13. C++后台开发面试常考
  14. 测试学习--云测试平台
  15. 科技公司逐鹿手机配件赛道,“降维打击”会出现吗?
  16. 系统加速比(amdahl定律)
  17. python合并word表格单元格_Python-Excel转word表格并合并流程
  18. 时钟周期,机器周期,指令周期的区别
  19. 【已解决】sftp命令没有反应
  20. rpm包制作之openssh8.7升级

热门文章

  1. ubuntu 默认鼠标双击问题
  2. WPF入门(三)-几何图形之不规则图形(PathGeometry) (2)
  3. Spring之事务管理配置
  4. keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
  5. H5面试题---介绍js的基本数据类型
  6. PHP面向对象编程(imooc)代码合集(四)
  7. Android学习——R文件丢失异常原因汇总
  8. 软件安全性能測试(转载)
  9. Asp.NET中常用的一些优化性能的方法
  10. 以金山界面库(openkui)为例思考和分析界面库的设计和实现——资源读取模块分析