/**

  • 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
  • 思路:
  • ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:private int ticketCount = 100;
  • ② 在Ticket类中重写run()方法实现卖票,代码步骤如下
  • A:判断票数大于0,就卖票,并告知是哪个窗口卖的
  • B:票数要减1 C:卖光之后,线程停止
  • ③ 定义一个测试类TicketDemo,里面有main方法,代码步骤如下
  • A:创建Ticket类的对象
  • B:创建三个Thread类的对象,把Ticket对象作为构造方法的参数,并给出对应的窗口名称
  • C:启动线程
    */

使用synchronized同步代码块实现

票类

package com.llb.卖票.my;/*** 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票* 思路:* ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:private int ticketCount = 100;* ② 在Ticket类中重写run()方法实现卖票,代码步骤如下* A:判断票数大于0,就卖票,并告知是哪个窗口卖的* B:票数要减1 C:卖光之后,线程停止* ③ 定义一个测试类TicketDemo,里面有main方法,代码步骤如下* A:创建Ticket类的对象* B:创建三个Thread类的对象,把Ticket对象作为构造方法的参数,并给出对应的窗口名称* C:启动线程*/
public class Ticket extends Thread {private int ticketCount = 100;
//    private Object o@Overridepublic void run() {while (true){synchronized (this){if (ticketCount>0){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}ticketCount--;System.out.println(Thread.currentThread().getName()+"在卖"+(ticketCount+1)+"号票,还剩"+ticketCount+"张票");}else {break;}}}}
}

main

package com.llb.卖票.my;public class TicketDemo {public static void main(String[] args) {Ticket ticket = new Ticket();Thread thread1 = new Thread(ticket);Thread thread2 = new Thread(ticket);Thread thread3 = new Thread(ticket);thread1.setName("窗口1---");thread2.setName("窗口2---");thread3.setName("窗口3---");thread1.start();thread2.start();thread3.start();}
}

使用synchronized同步方法实现

票类

package com.llb.卖票.my.同步方法;
/*** 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票* 思路:* ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:private int ticketCount = 100;* ② 在Ticket类中重写run()方法实现卖票,代码步骤如下* A:判断票数大于0,就卖票,并告知是哪个窗口卖的* B:票数要减1 C:卖光之后,线程停止* ③ 定义一个测试类TicketDemo,里面有main方法,代码步骤如下* A:创建Ticket类的对象* B:创建三个Thread类的对象,把Ticket对象作为构造方法的参数,并给出对应的窗口名称* C:启动线程*/
public class Ticket implements Runnable {private static int ticket = 100;@Overridepublic void run() {while (true){//            method();method2();}}// 同步方法// 同步锁是thisprivate synchronized void method(){if (ticket>0){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}ticket--;System.out.println(Thread.currentThread().getName()+"在卖"+(ticket+1)+"号票,还剩"+ticket+"张票");}}// 同步方法//同步锁是Ticket.class,当前类的字节码对象private static synchronized void method2(){if (ticket>0){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}ticket--;System.out.println(Thread.currentThread().getName()+"在卖"+(ticket+1)+"号票,还剩"+ticket+"张票");}}
}

main

package com.llb.卖票.my.同步方法;import com.llb.卖票.my.Ticket;public class TicketDemo {public static void main(String[] args) {Ticket ticket = new Ticket();Thread thread1 = new Thread(ticket);Thread thread2 = new Thread(ticket);Thread thread3 = new Thread(ticket);thread1.setName("窗口1---");thread2.setName("窗口2---");thread3.setName("窗口3---");thread1.start();thread2.start();thread3.start();}
}

多线程经典问题 卖票问题相关推荐

  1. 线程安全问题经典案例---卖票

      在入门多线程的时候,看到过不少的案例,其中卖票案例尤为经典,在这里自己也记录一下,同时加深对于线程安全的理解: 案例场景 情景一:    现在有一个电影院,马上要上映电影<战狼5>,电 ...

  2. 多线程实现火车站卖票

    问题: 模拟火车站卖票:共有100张票,实现10个站台同时售票,不能出现多卖. 以下分别用 Thread . Runnable .线程池 .Callable 实现 :分别以 synchronized ...

  3. 多线程模拟火车站卖票-继承Thread类

    public class Demo2_Snschronized { public static void main(String[] args) { // TODO Auto-generated me ...

  4. 8.3 多线程练习,卖票

    package com.atguigu.java;/*** 例子:创建三个窗口卖票,总票数为100张* @author Suki* @creat 2022-09-13 14:23*/class win ...

  5. java多线程并发卖票问题

    最近学习遇到了经典的多线程并发的卖票问题,在网上搜了一些答案,还是决定自己写一写看,于是就出现了这篇文章,希望对初学者有些帮助!!! package practice.threadsafe; /* 多 ...

  6. 多线程的经典案例(卖票)

    前两天在站内看到几个多线程卖票的案例,发现代码都不怎么对,运行结果也不符合预期,不能有效复现多线程并发的场景.故而自己写了一套,过程中也产生了一些新的思考,在此梳理一下. 先贴代码,假设现在电影院有1 ...

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

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

  8. 经典案例:卖票问题【线程同步】

    一.案例需求 某个电影院上映了史诗级大片<回村的诱惑>,共有100张票,卖票窗口总共有三个.请设计一个程序模拟卖票的过程! 二.步骤分析 1.定义一个卖票的线程类实现Runnable接口, ...

  9. Python 多线程卖票问题

    Python 多线程卖票问题 在学习多线程的时候,我们经常要学习到多窗口售票这一经典案例,今天我们将用Python语言写一个简单易懂的售票程序,帮助大家学习理解 有以下要求: 第一.不能出现打印出现混 ...

最新文章

  1. Linux Shell脚本编程学习笔记和实战
  2. 零基础入门深度学习的五篇经典教程
  3. [日志]开车要掌握的十六大绝技
  4. python枚举类型_Python 的枚举类型
  5. python 多关键字排序_用Python排序字​​典
  6. 测试开发工程师的简历和面试准备
  7. 智能硬件市场与产品概况整理
  8. 自适应遗传算法(AGA)《Adaptive Probabilities of Crossover》的剖析
  9. linux roundup函数记录
  10. C语言报错:a label can only be part of a statement and a declaration is not a statement
  11. 微信每天处理2.05亿通话 运营商只剩卖流量
  12. win8 发现不了网络计算机,Windows8系统无法开启网络发现如何解决
  13. nacos启动报错 Unable to start embedded Tomcat 以及项目链接nacos报错 server is DOWN now, please try again later!
  14. BuaaCoding 001-025 Problems and Solutions
  15. wpf DataGrid主从表,DataGrid嵌套DataGrid主从结构rowdetailtemplate实现,绑定DataTable数据源,使用Visual Studio 2017
  16. 使用 vim 需要知道的几个小技巧
  17. 编写代码的软件用什么编写的_编写正确的代码很重要的5个原因
  18. 建立一个GTalk连接和启动一个IM会话
  19. PC版收音机—龙卷风收音机
  20. java in.available_如何解决错误java.io.IOException:串行通信的nativeavailable输入/输出错误?...

热门文章

  1. [渝粤教育] 西南科技大学 房屋建筑学 在线考试复习资料(1)
  2. Broadcast广播消息
  3. 下一代防火墙组网简介
  4. 无货源开网店,淘宝,京东,拼多多,哪个最好?
  5. 什么是“Ground truth”
  6. Tomcat数据库连接池配置沤心沥血而作……
  7. 5000词学英语——DAY5
  8. 从欧洲旅游到买房移民希腊的考察全记录!
  9. 5.Ansible中的任务执行控制
  10. 面试题-渗透测试实习生