JAVA实验报告2模拟售票系统程序.docx
- 文档编号:8169117
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:17
- 大小:105.69KB
JAVA实验报告2模拟售票系统程序.docx
《JAVA实验报告2模拟售票系统程序.docx》由会员分享,可在线阅读,更多相关《JAVA实验报告2模拟售票系统程序.docx(17页珍藏版)》请在冰豆网上搜索。
JAVA实验报告实验报告2模拟售票系统程序模拟售票系统程序JAVA实验
(2)课程名称:
Java面向对象程序设计学院:
管理学院专业班级:
信息管理与信息系统(6)班学号:
*聂小东2010年05月26日管理学院信息管理与信息系统专业08信管6班_组学号*姓名张钟权协作者教师评定_实验题目模拟售票系统程序一、实验目的与要求
(1)实验目的:
通过线程和多线程的学习,设计一个模拟火车站售票大厅的工作情形,加深对线程和多线程的了解。
(2)实验要求:
按照Java程序设计教程的要求完成第二章中模拟火车站售票系统程序的编写和调试。
二、实验方案、SimulateRailwayStation类:
Main()方法:
程序入口;SimulateRailwayStation()方法:
安排界面布局;actionPerformed()方法:
按钮动作事件,调用“火车站售票大厅类”RailwayStation的generateCustomer()方法,模拟售票工作情形。
、RailwayStation类:
RailwayStation()方法:
构造函数;generateCustomer()方法:
接待新增顾客排队处理策略;addAgent()方法:
添加售票窗口;run()方法:
线程,调用updateDisplay()方法;updateDisplay()方法:
实时处理售票业务或等待客户;setup()方法:
售票窗口处于空闲或暂停服务。
、Agent类:
Agent()方法:
售票窗口编号;joinNewCustomer()方法:
在本窗口的队列中添加新顾客;releaseCustomer()方法:
记录顾客办理完业务离去人数;getCusOfQueue()方法:
读取本窗口的队列的顾客列表;run()方法:
线程,本窗口处理业务。
、Customer类:
Customer()方法:
顾客取得编号。
、List类:
List()方法:
顾客按队列结构排队。
三、实验结果和数据处理1、RailwayStation类:
火车站售票大厅类/*火车站售票大厅类*/classRailwayStationextendsPanelimplementsRunnable/定义售票窗口数组AgentprotectedAgentagent=newAgentSimulateRailwayStation.NUM_AGANTS;protectedLabellabelAgent=newLabelSimulateRailwayStation.NUM_AGANTS;protectedLabellabelQueue=newLabel(正在等待的顾客数:
0);protectedLabellabelServed=newLabel(已经服务的顾客数:
0);/定义可以进行售票服务的窗口protectedintnumAgents=SimulateRailwayStation.NUM_INITIAL_AGANTS;/定义存放已服务过的顾客数publicstaticintnumCustomerServered=0;privateThreadthread=null;publicRailwayStation()setup(各窗口实时状态显示:
);/显示各售票窗口的实时工作状态privatevoidsetup(Stringtitle)/定义售票窗口的工作状态面板PanelagentPanel=newPanel();agentPanel.setLayout(newGridLayout(SimulateRailwayStation.NUM_AGANTS,1);/各售票窗口的工作状态for(inti=0;iSimulateRailwayStation.NUM_AGANTS;i+)if(inumAgents)labelAgenti=newLabel(窗口+(i+1)+:
空闲中.);agentPanel.add(labelAgenti);/实例化售票窗口agenti=newAgent(i);/售票窗口开始售票服务agenti.start();elselabelAgenti=newLabel(窗口+(i+1)+:
暂停服务!
);agentPanel.add(labelAgenti);/定义顾客候票情况面板PanelotherPanel=newPanel();otherPanel.setLayout(newGridLayout(2,1);otherPanel.add(labelQueue);otherPanel.add(labelServed);setLayout(newBorderLayout();/显示各售票窗口的工作状态安排在下部add(South,agentPanel);/显示顾客候票状况安排在中部add(Center,otherPanel);/显示调用本方法setup()的参数安排在上部add(North,newLabel(title);/开始工作publicvoidstart()if(thread=null)thread=newThread(this);/启动线程thread.start();/线程,调用显示实时售票状况的updateDisplay()方法publicvoidrun()while(true)this.updateDisplay();/实时处理售票的状况publicvoidupdateDisplay()/定义在本窗口等候的顾客数inttotalSize=0;/对可以服务的窗口进行循环for(inti=0;i0)labelAgenti.setText(s+agenti.getCusOfQueue()+正在等待);elselabelAgenti.setText(s);elselabelAgenti.setText(窗口+(i+1)+:
空闲中.);for(inti=numAgents;iSimulateRailwayStation.NUM_AGANTS;i+)labelAgenti.setText(窗口+(i+1)+:
暂停服务!
);labelQueue.setText(正在等待的顾客数:
+totalSize);labelServed.setText(已经服务的顾客数:
+numCustomerServered);/火车站售票窗口关闭publicvoidstop()thread=null;for(inti=0;inumAgents;i+)/停止售票服务agenti.halt();/添加窗口publicvoidaddAgent()if(numAgents1)agentnumAgents-1.halt();numAgents-;/接待顾客的方法publicvoidgenerateCustomer()/所有工作窗口的队列中,至少有一个顾客在排队时为真.booleanallAgentQueueHasOne=true;/*如果所有正在工作窗口的队列中至少有一个顾客在排队,就把新顾客添加到队列最少的那个队.否则,就把顾客添加到没有业务处理的窗口中.*/对可以服务的窗口进行循环for(inti=0;inumAgents;i+)/如果本窗口队列中没有顾客if(agenti.getCusCountOfQueue()=0&agenti.getCIdOfHandling()=0)/添加新顾客agenti.joinNewCustomer(newCustomer();allAgentQueueHasOne=false;break;/如果所有工作窗口都有顾客在等候if(allAgentQueueHasOne)/定义变量index存放最少等候顾客数的窗口编号intindex=0;/对可以服务的窗口进行循环for(inti=0;inumAgents;i+)if(agenti.getCusCountOfQueue()0)Customerc=(Customer)customersofqueue.get(0);customersofqueue.delete(0);returnc;elsereturnnull;/本窗口已办理业务的顾客数publicintgetCusCountOfHandled()returnnumCustomers;/本窗口已办理业务的顾客列表publicStringgetCusOfHandled()if(customersofhandled.getSize()0)StringBuffersbuf=newStringBuffer();sbuf.append(顾客);for(inti=0;i0)StringBuffersbuf=newStringBuffer();sbuf.append(Customer);for(inti=0;i0)customersofqueue.delete(customersofqueue.getSize()-1);/顾客办理完业务离去publicvoidreleaseCustomer(Customerc)numCustomers+;customersofhandled.add(c);/本窗口在不断的处理业务publicvoidrun()while(running)trythread.sleep(int)(Math.random()*SimulateRailwayStation.MAX_NO_CUSTOMERS)+1000);Customercustomer=requestCustomerFor();/获得服务的顾客if(customer!
=null)handlingCId=customer.getCustomerId();/获得顾客ID/办理业务时间:
主要是询问等thread.sleep(int)(Math.random()*SimulateRailwayStation.BUSINESS_DELAY)/2);synchronized(this)/检索对应的票务信息for(inti=0;iSimulateRailwayStation.train_num.length;i+)if(customer.getCustomerWilling()=i+1)SimulateRailwayStation.ticketsi-;/对应票数减一/办理业务时间:
打印票、交钱等thread.sleep(int)(Math.random()*SimulateRailwayStation.BUSINESS_DELAY)/2);releaseCustomer(customer);/顾客办理后离开。
RailwayStation.numCustomerServered+=1;/服务顾客数+1elsehandlingCId=0;catch(InterruptedExceptionie)System.out.println(TellerException:
+ie);四、结论本次实验,是模拟售票系统程序设计,由实验可知,线程本身不是完整程序,既没有执行入口,也没有出口,因此其自身不能自动运行,必须栖身于某一进程之中,由进程触发执行。
五、问题与讨论在多线程应用程序中,线程是共享内存及其他资源的,但各个线程对这些数据的访问却是异步的,即当某一个线程访问共享内存时,并不知道其他线程是否也访问这些数据。
因此有时会出现共享数据不一致的危险。
这就出现了多线程的同步问题。
其解决思路是避免多个线程访问同一个对象,方法是为每一个对象的实例做一个标志,即“锁定标志”。
关键字synchronized提供了操作这个标志的方法,保证在任何时刻只有一个线程在访问共享数据。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 实验 报告 模拟 售票 系统 程序