生活中其实有很多多线程的例子,比如火车站售票就是一个例子。我们先来分析一下,

(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
*/

我们发现这个时候的输出结果是正确的。但是我们在运行的过程中发现运行速度没有之前快,这是因为加了锁以后每次都要进行开锁、关锁,所以执行速度变慢了。

多线程模拟火车站售票相关推荐

  1. 多线程模拟火车站售票并发

    花了一天的时间才搞懂的操作,以前觉得自己懂了,但是实践起来却又是另外一回事.总之受益良多. 不能在对象里sleep,对象里写while就是一次性的. 原子锁是线程的东西,也不要放在对象方法中 run方 ...

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

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

  3. 模拟火车站售票窗口,开启三个窗口售票,总票数为100张

    方法一:继承Thread class Window extends Thread{static int ticket = 100;public void run(){while (true) {if ...

  4. java 多线程 售票_Java 多线程 之 火车站售票实例

    package com.thread;/** 题目: 人们在火车站的售票窗口排队买火车票 1. 北京西站开门 2. 打开售票窗口 3. 北京西站有10张去长沙的票 4. 打开2个售票窗口, 5 假设每 ...

  5. Java 多线程 之 火车站售票实例

    http://www.verejava.com/?id=16992917973569 package com.thread; /*题目: 人们在火车站的售票窗口排队买火车票1. 北京西站开门2. 打开 ...

  6. Java多线程实现火车站售票案例

    铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果 i. 窗口001正在销售第1000张票 ii. 窗口001正在销售第999张票 iii. 窗口 ...

  7. 售票pv操作java实现_Java多线程实现火车站售票案例

    需求: 火车站有5个窗口,有1000张火车票,同时开始售票,请用Java多线程实现 分析: 这是学习Java多线程的时候必定会遇到的一个案例 窗口一共有五个,共同操作1000张票,多以票需要定义成静态 ...

  8. 运用java 多线程模拟火车售票。。。。

    public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub // ...

  9. java多线程售票问题_使用java多线程实现火车站售票的问题

    package com.softeem.demo; /** *@author leno *售票类 */ class SaleTicket implements Runnable { int ticke ...

最新文章

  1. 微信的Bug差点让我被老板炒鱿鱼!
  2. Spring 泛型依赖注入
  3. 问题解决:vue dev模式没问题,dist之后页面not found
  4. 【ArcGIS遇上Python】三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例
  5. 机器学习技法2-Dual Support Vector Machine
  6. 数据库与表的操作之重命名、删除表
  7. 去除AuotoCAD学生版水印的办法
  8. foxmail的邮局和端口_Foxmail如何进行POP、SMTP设置(pop)
  9. CSS基础知识——常用基础命令
  10. html5游戏毕业答辩ppt,毕业论文答辩ppt格式(超详细解释)
  11. 常用的求和公式(级数求和)
  12. 项目的运筹帷幄—项目进度、质量和成本最优决策理论探讨
  13. Tomcat,Servlet,JSP之间是什么关系?
  14. FPGA数字信号处理(1)- AM调制的FPGA实现
  15. 打包chromium浏览器
  16. 以太网接口与地平面设计3种方案
  17. Unity特效学习笔记——子弹
  18. Android包体积优化(常规、进阶、极致)
  19. ckeditor 工具栏配置
  20. 《信息学奥赛一本通(C++版)》求校体操队的人数

热门文章

  1. SQL注入的一般过程
  2. sql 查询一个表的数据插入到别一个表,ID自动增长
  3. 计算机音乐小二郎,小二郎_儿童歌曲_单曲在线试听_酷我音乐
  4. hbulider初学教程及html5五子棋小程序
  5. js点击事件在苹果ios端失效的解决方法
  6. Python数据类型——元祖
  7. 【解决方案】国标GB28181协议视频智能分析平台打造智慧企业AR云景解决方案
  8. 个人设置微信公众号自定义菜单的初级经验
  9. 采用DAWG方式在大批量字符串中查询字符串
  10. 水星路由器上网设置服务器无响应,怎么防止路由器DNS被劫持弹出广告