多线程模拟火车站售票
生活中其实有很多多线程的例子,比如火车站售票就是一个例子。我们先来分析一下,
(1)首先要有火车票的总数量,并且每卖出一张火车票,总量就减一
(2)当火车票的数量小于1的时候,就停止售票
(3)使用多线程模拟各个窗口进行售票
(4)当火车票售完后,火车站也同样欢迎我们
下来,我们代码来实现火车站售票实例
public class MyThread implements Runnable {int tickets=5;@Overridepublic void run() {while(true) {if(tickets>0) {try {Thread.sleep(100); //让当前线程睡一会儿} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+": "+tickets--);}}}}
public class ThreadDemo {public static void main(String[] args) {//创建线程实例MyThread mt=new MyThread();Thread t=new Thread(mt);t.setName("窗口一");t.start();//创建线程实例Thread t2=new Thread(mt);t2.setName("窗口二"); //修改线程名字t2.start(); //启动线程Thread t3=new Thread(mt);t3.setName("窗口三"); //修改线程名字t3.start(); //启动线程}
}/*
窗口三: 5
窗口一: 4
窗口二: 3
窗口三: 2
窗口一: 1
窗口二: 0
窗口三: -1
*/
观察输出结果,居然出现了-1!这不是我们想要的结果,为什么呢?因为在run()方法中,我们使用sleep()方法让线程睡了一会儿,就出现了-1这个结果,那为什么呢?
我们可以这样理解,假设此时就只剩下一张票没有卖出去了,
这时t1进来了,一看有票准备开始售票,但是他突然肚子疼就去上厕所了。
这个时候t2进来了,一看有票准备开始售票,但是他突然也肚子疼就去上厕所了。
其实这个时候相当于t1、t2已经进入if这个判断语句了。
过了一会儿t1上完厕所回来了,开始售票,这个时候所有的票已经卖完了,tickets=0。
这个时候t2也上完厕所回来了,但是他不知道票卖完了(因为他早都进入if语句里面了),然后开始售票,这个时候tickets=-1就出现了我们上面的结果了。
所以为了解决这个问题,我们引入了同步机制
synchronized: 关键字,同步(锁),可以修饰代码块和方法,一旦被某个线程访问,则直接锁住,其它线程不能访问
同步代码块
synchronized(锁){}
注意:锁对象需要被所有线程共享
接着上面的例子,我们给其上锁
public class MyThread implements Runnable {int tickets=5;Object obj=new Object(); //锁对象@Overridepublic void run() {while(true) {synchronized(obj){ //上锁if(tickets>0) {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+": "+tickets--);}}} }
}
/*
窗口二: 5
窗口二: 4
窗口一: 3
窗口一: 2
窗口三: 1
*/
我们发现这个时候的输出结果是正确的。但是我们在运行的过程中发现运行速度没有之前快,这是因为加了锁以后每次都要进行开锁、关锁,所以执行速度变慢了。
多线程模拟火车站售票相关推荐
- 多线程模拟火车站售票并发
花了一天的时间才搞懂的操作,以前觉得自己懂了,但是实践起来却又是另外一回事.总之受益良多. 不能在对象里sleep,对象里写while就是一次性的. 原子锁是线程的东西,也不要放在对象方法中 run方 ...
- java 模拟火车站售票系统_模拟售票系统java编程
模拟售票系统java编程 /* 项目:用多线程设计一个模拟火车站售票大厅的工作情形. 问题描述:火车站有许多售票窗口,有些开放,有些不开放.顾客进入火车站售票厅后,到某个售票窗口排队等候,排到了就办理 ...
- 模拟火车站售票窗口,开启三个窗口售票,总票数为100张
方法一:继承Thread class Window extends Thread{static int ticket = 100;public void run(){while (true) {if ...
- java 多线程 售票_Java 多线程 之 火车站售票实例
package com.thread;/** 题目: 人们在火车站的售票窗口排队买火车票 1. 北京西站开门 2. 打开售票窗口 3. 北京西站有10张去长沙的票 4. 打开2个售票窗口, 5 假设每 ...
- Java 多线程 之 火车站售票实例
http://www.verejava.com/?id=16992917973569 package com.thread; /*题目: 人们在火车站的售票窗口排队买火车票1. 北京西站开门2. 打开 ...
- Java多线程实现火车站售票案例
铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果 i. 窗口001正在销售第1000张票 ii. 窗口001正在销售第999张票 iii. 窗口 ...
- 售票pv操作java实现_Java多线程实现火车站售票案例
需求: 火车站有5个窗口,有1000张火车票,同时开始售票,请用Java多线程实现 分析: 这是学习Java多线程的时候必定会遇到的一个案例 窗口一共有五个,共同操作1000张票,多以票需要定义成静态 ...
- 运用java 多线程模拟火车售票。。。。
public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub // ...
- java多线程售票问题_使用java多线程实现火车站售票的问题
package com.softeem.demo; /** *@author leno *售票类 */ class SaleTicket implements Runnable { int ticke ...
最新文章
- 微信的Bug差点让我被老板炒鱿鱼!
- Spring 泛型依赖注入
- 问题解决:vue dev模式没问题,dist之后页面not found
- 【ArcGIS遇上Python】三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例
- 机器学习技法2-Dual Support Vector Machine
- 数据库与表的操作之重命名、删除表
- 去除AuotoCAD学生版水印的办法
- foxmail的邮局和端口_Foxmail如何进行POP、SMTP设置(pop)
- CSS基础知识——常用基础命令
- html5游戏毕业答辩ppt,毕业论文答辩ppt格式(超详细解释)
- 常用的求和公式(级数求和)
- 项目的运筹帷幄—项目进度、质量和成本最优决策理论探讨
- Tomcat,Servlet,JSP之间是什么关系?
- FPGA数字信号处理(1)- AM调制的FPGA实现
- 打包chromium浏览器
- 以太网接口与地平面设计3种方案
- Unity特效学习笔记——子弹
- Android包体积优化(常规、进阶、极致)
- ckeditor 工具栏配置
- 《信息学奥赛一本通(C++版)》求校体操队的人数