文章目录

  • 实验要求
  • 一、程序流程图(试验原理)
  • 二、变量说明
  • 三、功能分析及设计
  • 四、多线程卖票的实现
  • 五、实验结果及代码
    • 代码:

实验要求

用多线程设计一个模拟火车站售票大厅的工作情形。火车站有许多售票窗口,有些开放,有些不开放。用多个线程去订票,不能有两个或者以上的线程订到同一个票,当最后一张票卖掉时,再订就异常提示出票卖完了。每个窗口买票需要1-3秒的时间,每次卖票需要打印出买票的时间和买票的窗口名。

一、程序流程图(试验原理)

二、变量说明

count:当前剩余总票数 place[]:途径站点
num:本次售卖总票数 number[]:相应起始地与目的地之间剩余票数
toplace[]:存储相应起始地与目的地信息

三、功能分析及设计

①火车站有许多窗口,有些开放有些不开放,我们规定一共10个售票口,每次随机开放3-10个,所以我们引入java.util.Random,java.util.Vector,java.util.Collections设计卖票前的vect方法,先得到一个3-10随机开放窗口数open,在创建一个存储随机数的集合,执行open次数的int number = r.nextInt(10) + 1,并利用!v.contains(number)去重得到当前开放窗口,用 Collections.sort(v)排序后显示当前开放窗口。

②用多个线程去订票,不能有两个或者以上的线程订到同一个票,当最后一张票卖掉时,再订就异常提示出票卖完了。每个窗口买票需要1-3秒的时间,每次卖票需要打印出买票的时间和买票的窗口名,所以我们引入java.util.Random,java.text.SimpleDateFormat,java.util.Calendar,用random模拟每次买票需要1-3秒的随机时间,再规定时间格式SimpleDateFormat formatter = new SimpleDateFormat (“yyyy-MM-dd HH:mm:ss”),并将对当前出票时间按设定格式输出formatter.format(calendar.getTime())。起始地与目的地用random随机抽取toplace[]信息,并减少number[]相对应票数。
多线程模拟售票窗口订票则需要重写类的run()方法,改为执行新的sellTicket()方法,实现线程互斥和线程同步,并通过改变线程状态以控制线程调度,每次卖票后当前剩余总票数count减1,用Trainticket t = new Trainticket(num)建立总票数对象,最后创建open数量的线程对象窗口,new Thread(t,“售票点”+v.elementAt(i)).start()建立并运行线程,模拟售票操作。

四、多线程卖票的实现

我们用重写的run()方法调用sellTicket()方法模拟多线程卖票:
①将方法声明为synchronized类型,synchronized是一种同步锁,他的作用是一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞,以保证线程间的互斥,即售票窗口不能同时办理卖票操作。

②进程的阻塞与唤醒,通过this.notifyAll(),this.wait()实现,为防止由于synch ronized锁定造成的单窗口处理所有卖票操作结果,我们将买卖票成功的窗口通过this.wait()休眠,则下一次卖票不会访问上一次的线程,再用this.notifyAll()唤醒所有睡眠线程继续工作直到总票数为0,进行一次票数等于0的判断帮助跳出循环,所有窗口显示票数为0并结束售票。

③模拟卖一张票的过程需要花1-3秒,Thread.sleep(rand.nextInt(2001)+ 1000),让线程休息售票时间模拟引票处理,此时程序休息等待处理结束。

④创建线程对象并开始卖票,用Trainticket t = new Trainticket(num)建立总票数对象,最后创建open数量的线程对象窗口,用for遍历建立并启动相应的线程new Thread(t,“售票点”+v.elementAt(i)).start()模拟售票操作。

每次卖票操作输出包括当前时间,当前线程名Thread.currentThread().getName(),剩余总票数count,以及出发地与目的地,卖完票时显示窗口票数卖完。

五、实验结果及代码

总票数:20张
天津------->北京:2张,北京------->天津:2张,天津------->沈阳:4张,
北京------->沈阳:5张,沈阳------->北京:1张,沈阳------->天津:6张。
总售票口数:10 随机开放[3,10]个售票口
第一次卖票:

第二次卖票:

代码:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Random;
import java.util.Vector;public class Trainticket implements Runnable{private int count;private String[] place = {"北京","天津","沈阳"};//站点private static int num=20;//总票数private static int []number={2,2,4,5,1,6};//相应起始地与目的地之间票数private static String[] toplace={"天津------->北京","北京------->天津","天津------->沈阳","北京------->沈阳","沈阳------->北京","沈阳------->天津",};SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd   HH:mm:ss");  public Trainticket(int t) {this.count = t;}@Overridepublic void run() {     //重写run()方法this.sellTicket();}private synchronized void sellTicket(){while (this.count>0){this.notifyAll();Random rand = new Random();Calendar calendar = Calendar.getInstance();System.out.print(formatter.format(calendar.getTime())+"\t"+Thread.currentThread().getName()+"\t成功出票剩余票数:"+(--count));//输出当前的时间,售票口和票数Random r = new Random();int p=r.nextInt(6);while(number[p]==0){p=r.nextInt(6);}number[p]--;System.out.println("\t"+toplace[p]);if (this.count==0)break;try {Thread.sleep(rand.nextInt(2001)+ 1000);  //模拟卖一张票的过程需要花1-3秒this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName()+"票已售完");}private static void vect(Vector<Integer> v,int m,int n){Random r = new Random();// 创建一个存储随机数的集合int open=r.nextInt(m)+n;int count = 0;while (count < open) {int number = r.nextInt(10) + 1;//一共10个窗口,开放指定数量// 判断number是否在集合中存在if (!v.contains(number)) {// 不在集合中,就添加v.add(number);count++;}}Collections.sort(v);System.out.print("开放的售票口为:");for(int i=0;i<v.size();i++){System.out.print(" 售票点"+v.elementAt(i)+" ");}System.out.println();}public static void main(String[] args) {// TODO Auto-generated method stubVector<Integer> v = new Vector<Integer>();vect(v,8,3);//开放3-10个窗口//创建线程类对象Trainticket t = new Trainticket(num);//一共20张票//启动线程for(int i=0;i<v.size();i++){new Thread(t,"售票点"+v.elementAt(i)).start();}}}

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

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

    生活中其实有很多多线程的例子,比如火车站售票就是一个例子.我们先来分析一下, (1)首先要有火车票的总数量,并且每卖出一张火车票,总量就减一 (2)当火车票的数量小于1的时候,就停止售票 (3)使用多 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. java多线程模拟购买火车票

    java多线程模拟购买火车票 本次做的是一个火车票的售卖模拟,不管用户是在窗口还是APP上购买,必然不可能买到同一张票这也就是说一张票的售卖必然是一个线程在操作的,所以,我们在写代码是也要注意这一点 ...

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

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

最新文章

  1. Spring的qualifier标签
  2. 数字图像处理实验(16):PROJECT 06-03,Color Image Enhancement by Histogram Processing
  3. python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!
  4. 中英文对照 —— 饮食与美食
  5. 三校生计算机高考试卷及答案,云南三校生计算机专业课高考试卷3
  6. 班长团支书福音——爬虫+腾讯云短信平台实现自动提醒同学体温上报 【附源码】
  7. 电气元件知识大全:实物图、作用、型号分类、工作原理、符号都有
  8. 网络安全简历如何写?
  9. 菜菜的刷题日记 | 215. 数组中的第K个最大元素
  10. python入门学习随记(十二)
  11. 网页游戏对java的技术要求_网页制作谈谈什么技术是Java开发网页游戏的必要条件呢?怎样在微信公众平台上制作5级游戏?...
  12. Qt 编程 keySight 34401A 万用表(串口232编程)
  13. 浏览器做打假助手,边界在哪里?
  14. Android开发————简易App设计(一)
  15. hbuilderx安装教程_HBuilderX初级安装使用教程
  16. eclipse pull异常 Pulling 1 respository (The pull operation was canceled)
  17. Teradata和Exadata
  18. [基础]Qt Creator 的 Shadow build(影子构建)
  19. gedit编辑html中文,gedit编辑器
  20. 软考高级哪个含金量高?容易过?

热门文章

  1. 安装selenium时报错,Unable to create process using ‘D:\ProgramData\python.exe D:\ProgramData\Scripts\pip-s
  2. 行列式用计算机怎么算,行列式计算机方法
  3. Attention机制原理
  4. 网络信息安全之防火墙入反病毒技术 (七)
  5. 如何让客户接受你的价格比别人更高?
  6. 这么简单的道理,猩猩都懂,我们却忘了
  7. IEEE1588 Precision Time Protocol(PTP)
  8. 打开我的收藏夹 -- Python数据分析杂谈
  9. iPhone6和iPhone6Plus的适配
  10. signature=c7580760a679f082e2d4960e4c2c7772,Signatures of moiré-trapped valley excitons in MoSe