• 学习多线程比较经典的案例就是实现售票系统了。

  • 我们先来看看需求:铁道部发布了一个售票任务,要求销售100张票,要求有5个窗口来进行销售,效果如下:

      窗口001正在销售第100张票窗口001正在销售第99张票窗口002正在销售第98张票. . .窗口05正在销售第1张票票已经销售完毕
    
  • 对需求进行分析

      一共有1000张票,5个窗口同步执行;所以需要用到多线程技术,其中车票数应该被5个窗口共享,不然容易出现出售同一张票的问题。
    
  •   下面用两种实现线程的方式来完成需求:
    

一、通过继承Thread类

package com.hym.Threaded;public class SaleSysTest {public static void main(String[] args) {//创建5个线程,传入 线程名: [001]、[002]...并开启for(int i=1;i<6;i++){new SaleThread("[00"+i+"]").start();}}
}class SaleThread extends Thread {//车票数被共享,所以定义为static,数量为100.private static int ticket = 100;//通过锁来保证线程不会重复访问.private static Object obj = new Object();//有参构造传入线程名public SaleThread(String name) {super(name);}public SaleThread() {}//重写run()方法,将售票动作放入其中;@Overridepublic void run() {while (true) {//在锁外使用sleep( );以便于更好的解决复现问题try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//使用synchronized需要锁统一资源,不然没效果,所以将obj初始化为static静态。//但让也可以使用字符串 synchronized("lock");lock随便输入synchronized (obj) {//还有余票---出票if (ticket > 0) {System.out.println(Thread.currentThread().getName() + "号窗口第"+ ticket + "票正在出票...");ticket--;} else {//车票售完System.out.println("车票已售完,下次请趁早...");//不能使用break或者return,后面进行解释。System.exit(0);}}}}
}
  • 执行结果:----太长了只截了末尾部分大伙凑合凑合

二、通过实现Runnable接口

  • 与第一种方式的区别不大
package com.hym.Threaded;public class Test {public static void main(String[] args) {//得到对象SaleSys ss = new SaleSys();//把对象放入线程中for(int i=1;i<6;i++){new Thread(ss,"[00"+i+"]").start();}}
}class SaleSys implements  Runnable {     //定义票的总数private int ticket = 100;//定义一个线程同步对象private Object obj = new Object();@Overridepublic void run() {while(true){try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//同步锁synchronized(obj){if(ticket > 0){System.out.println(Thread.currentThread().getName()+" 售出第   "+ticket +"  张票");ticket--;}else{System.out.println("票已售完,请下次再来!");System.exit(0);}}}}
}
  • 执行结果

  • 最后解释一下为什么使用System.exit(0)退出,而不是Break,也不是Return。
    system.exit(0):

      是方法调用,在程序的任何地方都会显式表明JVM进程要退出系统了,返回值为0,可以通过%errorlevel%来取得。
    

return:

   它是一个关键字,表明返回调用当前方法的方法中。 如果是在main()方法中,可以起到退出虚拟机就的作用,但是如果是存在多线程的话return并不能保证JVM退出.,因为要所有的线程都结束才行。当不在main()方法中时,System.exit(0)直接终止程序,就算后面有代码也不执行了,而return则返回至调用该方法的地方,如果后面还有代码则继续执行,Break想必就不用说了吧。
  • 在此用return,break的话就会出现 " 下次请趁早+5 " 的情况。当然如果你需要出现每个窗口都提示票售空的情况可以使用break;主要看需求。

Java多线程实现售票系统相关推荐

  1. 利用JAVA多线程模拟售票系统,对统一资源进行处理

    首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...

  2. Java多线程模拟售票系统

    Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...

  3. Java——多线程(铁路售票系统案例)

    问题:铁路售票,一共100张,通过四个窗口卖完. 要求:分别用 继承Thread类 和 实现Runnable接口 去实现 ①用继承Thread类去实现 package com.yy.syn;publi ...

  4. 基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  5. java火车票订票系统 论文_毕业设计(论文)-基于JAVA的火车票售票系统.doc

    毕业设计(论文)-基于JAVA的火车票售票系统.doc 还剩 45页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点 ...

  6. java 模拟火车站售票系统_模拟售票系统java编程

    模拟售票系统java编程 /* 项目:用多线程设计一个模拟火车站售票大厅的工作情形. 问题描述:火车站有许多售票窗口,有些开放,有些不开放.顾客进入火车站售票厅后,到某个售票窗口排队等候,排到了就办理 ...

  7. [附源码]java毕业设计汽车票售票系统lunwen

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  8. [附源码]java毕业设计影院售票系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. Java多线程 模拟售票窗口售票

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...

最新文章

  1. 如何学习linux编程
  2. Google和微软分别提出分布式深度学习训练新框架:GPipe PipeDream
  3. Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
  4. 启动LINUX系统后,进入图形化界面的命令
  5. 获取Spring的ApplicationContext的几种方式
  6. 乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界
  7. Java 内部类 和 匿名内部类
  8. 【Elasticsearch】Elasticsearch能检索出来,但不能正确高亮怎么办 高亮部分数据 高亮指定字符串 Ngram
  9. java组合与继承始示例_Java 9功能与示例
  10. 计算机软件著作权的保护范围,计算机软件的著作权保护范围分析
  11. 前端技术周刊 2018-08-06:ES Module
  12. 单片机编程软件很简单(11),Keil单片机编程软件在线调试
  13. HTML5游子吟网页的完整代码,游子吟
  14. 【2020总结】脚踏实地,仰望星空
  15. 网站如何被百度蜘蛛快速抓取?
  16. php 客服工单分配问题,最全客服工单系统功能介绍
  17. 蜀门linux服务端架设,蜀门1296LINUX私服服务端(红旗6架设视频+工具)
  18. 移动端隐藏手机虚拟键盘
  19. 自动化运维工具——puppet详解(二)
  20. macbook进水不用怕

热门文章

  1. 既然安卓免费,那 Google 是靠什么赚钱的?
  2. linux最全的命令大全,shell运维手册
  3. Web端测试和App端测试的区别
  4. matlab 单位圆网格,MATLAB-曲面与网格图命令
  5. 前端三大主流框架的区别(三)
  6. Spring学习(六):WebFlux
  7. 交通标志分割处理的matlab仿真与分析
  8. Linux的Bash——(二)Shell的变量
  9. digester java_利用Digester把XML转换为Java对象
  10. 体恤门店,罗曼林冰淇淋发布疫情地区商户补贴方案