Java多线程实现售票系统
学习多线程比较经典的案例就是实现售票系统了。
我们先来看看需求:铁道部发布了一个售票任务,要求销售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多线程实现售票系统相关推荐
- 利用JAVA多线程模拟售票系统,对统一资源进行处理
首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...
- Java多线程模拟售票系统
Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...
- Java——多线程(铁路售票系统案例)
问题:铁路售票,一共100张,通过四个窗口卖完. 要求:分别用 继承Thread类 和 实现Runnable接口 去实现 ①用继承Thread类去实现 package com.yy.syn;publi ...
- 基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
- java火车票订票系统 论文_毕业设计(论文)-基于JAVA的火车票售票系统.doc
毕业设计(论文)-基于JAVA的火车票售票系统.doc 还剩 45页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点 ...
- java 模拟火车站售票系统_模拟售票系统java编程
模拟售票系统java编程 /* 项目:用多线程设计一个模拟火车站售票大厅的工作情形. 问题描述:火车站有许多售票窗口,有些开放,有些不开放.顾客进入火车站售票厅后,到某个售票窗口排队等候,排到了就办理 ...
- [附源码]java毕业设计汽车票售票系统lunwen
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- [附源码]java毕业设计影院售票系统
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- Java多线程 模拟售票窗口售票
编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...
最新文章
- 如何学习linux编程
- Google和微软分别提出分布式深度学习训练新框架:GPipe PipeDream
- Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
- 启动LINUX系统后,进入图形化界面的命令
- 获取Spring的ApplicationContext的几种方式
- 乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界
- Java 内部类 和 匿名内部类
- 【Elasticsearch】Elasticsearch能检索出来,但不能正确高亮怎么办 高亮部分数据 高亮指定字符串 Ngram
- java组合与继承始示例_Java 9功能与示例
- 计算机软件著作权的保护范围,计算机软件的著作权保护范围分析
- 前端技术周刊 2018-08-06:ES Module
- 单片机编程软件很简单(11),Keil单片机编程软件在线调试
- HTML5游子吟网页的完整代码,游子吟
- 【2020总结】脚踏实地,仰望星空
- 网站如何被百度蜘蛛快速抓取?
- php 客服工单分配问题,最全客服工单系统功能介绍
- 蜀门linux服务端架设,蜀门1296LINUX私服服务端(红旗6架设视频+工具)
- 移动端隐藏手机虚拟键盘
- 自动化运维工具——puppet详解(二)
- macbook进水不用怕