还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
项目用多线程设计一个模拟火车•站售票大厅的工作情形问题描述火车站有许多碍票窗口,有些开放,有些不开放顾客进入火车站售票厅后,到某个售票窗口排队等候,排到了就办理业务,然后离去如图
2.1所示*//**共有五个类:*SimulateRailwayStation具体运行主类;*RailwayStation:火车站售票大厅类*Agent类代表火车站售票窗口类;♦Customer类:顾客类;*List类:存储类*/java.util.Date;java.awt.*;java.awt.event.*;classSimulateRailwayStationextendsFrameimplementsActionListener〃设置每个窗口从一个顾客完成到下一个顾客开始的时间间隔次,”南京-〉福州231次“,南京-〉杭州65次,南京-〉武汉,112次,南京-〉成都77次”南京->天津21次南京->徐州,134次〃,南京-〉乌鲁目齐335次〃,”南京-〉合肥456次};//与上面的信息对应的每辆火车的票务信息piotectedstaticint[]tickets={5070505050120601005050};}〃获得本窗口的队列中的顾客列表publicsynchronizedStringgetCusOfQueueOifcustomersofqueue.getSizeO0StringBuffersbuf=newStringBuffer;sbuf.appendCustomer;forinti=;icustomersofqueue.getSizeO;i++sbuf.appendCustomercustomersofqueue.geti.getCustomcrld;ifi!=customersofqueue.getSizeOTsbuf.append*;}returnsbuf.toStringO;elsereturnnewString〃〃;}〃获得本窗口的队列中的顾客数publicintgetCusCountOfQueuereturncustomersofqueue.getSizeO;}〃本窗LI队列中的顾客未办理业务离去publicvoidCustomerLeftifcustomersofqueue.getSize0customersofqueue.deletecustomersofqueue.getSize-1;}//顾客办理完业务离去publicvoidreIeaseCustomerCustomercnumCustoniers++;customersofhandled.addc;}〃本窗11在不断的处理业务publicvoidrunwhilerunningtrythread.sleepintMathrandomimu1ateRai1wayStation.MAX_NO_CUSTOMERS+1000;Customercustomer=requestCustomerFor;//获得服务的顾客ifcustomer!=nul1handlingCId=customcr.gotCustomerldO;〃获得顾客ID〃办理业务时间:主要是询问等thread.slcepintMathrandom*SimulateRaiIwayStation.BUSINESSDELAY/2;synchronizedthis{〃检索对应的票务信息forinti=0;KSimulateRaiIwayStation.trainnum.length;i++ifcustomer.getCustomerWillingO==i+lSimulateRaiIwayStation.tickets[i]―;//对应票数减一}}〃办理业务时间:打印票、交钱等thread.sleepCintMathrandom*SimulateRaiIwayStation.BUSINESSDELAY/2;relcaseCustomcrcustomer;〃顾客办理后离开RailwayStation.numCustomerServered+=1;//服务顾客数+1elsehand1ingCId=0;}catchInterruptedExceptionieSystemout.printinTellerException:+ie;}}/*顾客类classCustomer〃顾客开始排队的时间privateDatecreated;〃顾客ID每个顾客都有唯一的ID不能重复privatestaticintcld;//顾客购买票务的意愿,比如去哪里,班次等.privateintcustomerwi11ing=0;publicCustomer//顾客进入车站时就已经想好了买什么票并且是火车站能够提供的.customerwilling=intMathrandom*10+1;creatcd=newDate;++cld;Systemout.printnewCustomcr+cld+;}//获得顾客HpublicintgetCustomerldOreturncld;}〃获得顾客买票意愿pub1icintgetCustomerWi11ingreturncustomerwi11ing;}〃获得顾客从进入火车站到离开窗口的时间publiclonggetWaitTimeDatenowreturnnow.getTime-created.getTimeO;}}/*构造一个队列容器每个服务的窗口都有一个,顾客总是先进入这个队列容器后,再进行窗口的业务处理.*/classList{〃定义队列最大容量10人privateintmaxItems=100;privateintnumItcms=0;privateintID二T;privateObject[]list=null;publicListlist=newObject[maxIterns];}publicListintmaxIternsthismax11ems=max11ems:list二newObject[thismaxIterns];}〃在队列中增加顾客publicvoidaddObjectobjlist[numltems++]=obj;}〃在有人离开队列publicvoiddeleteintposforinti=pos+l;inumlterns;i++numltcms—;}〃得到队列中指定的人publicObjectgetintposreturnlist[pos];}//队列中的人数publicintgetSizeOreturnnumIterns;}〃队列是否满了超过100人publicbooleanisFullreturnnumltems=maxltems;}〃实例化火车站传票大厅类privateRaiIwayStationrai]waystation=newRaiIwayStationO;〃建立窗体适配器,能关闭窗口privateclassWindowCloserextendsWindowAdapterpublicvoidwindowClosingWindowEventweraiIwaystation.stopO;Systemexit0;}〃构造方法,完成界面初始化publicSimulaleRaiIwayStationsuper^SimulationRaiIwayStalion;〃设置面板Panelbuttons=ncwPanel;buttons.setLayoutnewFlowLayout0;//在面板中添加按钮buttonsaddaddeus;buttonsadddelcus;buttonsaddaddagent;buttons.adddelagent;〃对按钮设置监听addeus.addActionListenerthis;dolcus.addActionListenerthis;addagent.addActionListenerthis;delagent.addActionListenerthis;〃对窗体适配器设置监听addWindowListenernewWindowCloser;setLayoutnewBorderLayout;addNorth”railwaystation;addSouthbuttons;setSize500200;validate;pack;show;〃调用火车站售票大厅类的start方法,开始售票工作railwaystationstart;publicvoidactionPerformedActionEventaeifae.getSource=addcus〃新增顾客railwaystation.generateCustomer;elseifae.getSource==de1cus}elseifae.getSource==addagcnt//增加售票窗口raiIwaystation.addAgent;}elseifae.getSource==de1agent〃关闭服务窗口raiIwaystation.retireAgent0;publicstaticvoidmainString[]argsSimulateRaiIwayStationsmlt=newSimulateRaiIwayStation;}}/*火车站侈票大厅类*/classRai1wayStationextendsPanelimplementsRunnableagent=newAgent[SimulateRailwayStation.NUMAGANTS];labelAgont=newLabel[SimulateRaiIwayStation.NUMAGANTS];labelQueue二newLabelC正在等待的顾客数0〃;labelScrvcd=nowLabelz,己经服务的顾客数:0;〃定义可以进行售票服务的窗口protectedintnumAgents=SimulateRaiIwayStation.NUMINITIALAGANTS;〃定义存放已服务过的顾客数publicstaticintnumCustomerServered=0:privateThreadthread=nul1;publicRailwayStationOsetupf各窗口实时状态显示:;}〃显示各售票窗口的实时工作状态privatevoidsetupStringtitle//定义售票窗口的工作状态面板PanelagentPanel=newPanel;agentPane
1.setLayoutnewGridLayoutSimulateRai1wayStation.NUM_AGANTS1;〃各售票窗口的工作状态forinti=0;KSimulatcRaiIwayStation.NUMAGANTS;i++ifinumAgentslabelAgent[i]=newLabelw窗口”+i+l+:空闲中agentPaneI.add1abelAgent[i];//实例化售票窗口agent[i]=nowAgenti;〃售票窗口开始售票服务agent[i].start;}elselabelAgent[i]=newLabel窗口”+i+l+:暂停服务!;agcntPanel.addlabelAgent[i];}//定义顾客候票情况面板PanelotherPanel=newPanel:otherPanel.setl-ayoutnewGridLayout21;otherPanel.addlabelQueue;otherPanel.addlabelServed;setLayoutnewBorderLayout;〃显示各售票窗口的工作状态安排在下部addSouth”agentPanel;〃显示顾客候票状况安排在中部addCenterotherPanel;〃显示调用本方法setup的参数安排在上部addNorth”newLabeltitle;}〃开始工作publicvoidstartifthread==nullthread=newThreadthis:〃启动线程threadstart0;}}//线程,调用显示实时售票状况的叩datelisplay方法publicvoidrunwhiletruethis.updateDisplay;}〃实时处理售票的状况publicvoidupdateDisplay//定义在本窗口等候的顾客数inttotalSize=0;//对可以服务的窗口进行循环forinti=0;XnumAgents;i++//getCIdOfHand1ing方法为正在办理业务的顾客编号ifagent[i].gotCIdOfHand1ing!=0〃统计在本窗口等候的顾客数tota1Size+=agent[i].getCusCountOfQueue;Strings=窗口+i+l+:正在办理顾客+agent[i].getCIdOfHandling+业务;〃显示在本窗口等候的顾客数ifagent[i].getCusCountOfQueue0labolAgent[i].setTexts+,z[,z+agent[i].getCusOfQueue+正在等待]”;elselabolAgent[i].setTexts;}elselabelAgent[i].setTextC窗口”+i+l+:空闲中}}forinti=numAgents;KSimulateRaiIwayStation.NUMAGANTS;i++labelAgent[i].setTextC^窗口+i+l+”:暂停服务!;labelQueue.setText正在等待的顾客数:+totalSize;labelServed.setText巳经服务的顾客数:z,+numCustomerServered;}〃火车站售票窗口关闭publicvoidstopthread=null;forinti=0;XnumAgents;i++〃停止售票服务agent[i].halt0;}〃添加窗口publicvoidaddAgentifnumAgentsSimulciteRailwayStcition.NUM_AGANTSagent[numAgents]=newAgentnumAgents;agent[numAgents].start;numAgents++;}〃关闭窗口,该方法暂时没有使用publicvoidretireAgentifnumAgents〉1agent[numAgents-1].halt:nunvXgents一;}〃接待顾客的方法publicvoidgenerateCustomer〃所有工作窗口的队列中,至少有一个顾客在排队时为真.booleanallAgentQueueHasOne二true;/*如果所有正在工作窗口的队列中至少有一个顾客在排队就把新顾客添加到队列最少的那个队.否则就把顾客添加到没有业务处理的窗口中.*/〃对可以服务的窗口进行循环forinti=0;KnumAgcnts;i++〃如果本窗口队列中没有顾客ifagent[i].getCusCoun10Queue==0agent[i].getCIdOfHandling—0〃添加新顾客agent[i].joinNewCustomernewCustomer;allAgontQucucHasOne=falsc;break;}〃如果所有工作窗II都有顾客在等候ifa11AgentQueueHasOne〃定义变量index存放最少等候顾客数的窗口编号intindex=0;//对可以服务的窗口进行循环forinti=0;i〈numAgents;i++ifagent[i].getCusCountOfQueueagent[index].getCusCounlOfQueue见教材}//往最少顾客的窗口加新顾客agent[index]joinNewCustomernewCustomer;}/*火车站售票窗口类*/classAgentextendsPanelimplementsRunnable//窗口开放标志privatebooleanprivateintprivateintrunning=false;ID=-1;numCustomers=0;privateinthandlingCId=O;〃该窗口中排队的顾客privateListcustomersofqueue=newList;〃该窗口中已办理的顾客privateprivateprivateprivate〃构造方法,定义仙:票窗II编号publicAgentintID见教材}//售票窗口开始售票服务publicvoidstart{ifthread==nullrunning=true;thread=ncwThreadthis;〃启动线程threadstart;}〃停止售票服务publicvoidhalt{running=false;}〃获得正在办理业务的顾客IDpublicintgetCIdOfHandlingreturnhandlingCId;}〃从本窗口的队列中获得将要服务的顾客publicCustomerrequestCustomerForifcustomersofqueue.gotSize0Customerc=Customercustomersofqueue.get0;custornersofqueue.deleteO;returnc;elsereturnnull;}〃本窗口已办理业务的顾客数publicintgetCusCountOfHandledreturnnumCustomers;}〃本窗II己办理业务的顾客列表publicStringgetCusfHandledifcustomersofhandled.gctSizc0StringBuffersbuf=newStringBuffer;sbuf.appendC顾客”;forinti=0;icustomersofhandled.getSizeO;i++sbuf.appendCustomercustomersofhandled.geti.getCustomerld;ifi!=customcrsofhandled.gctSize-lsbuf.append*;}returnsbuf.toStringO;elsereturnnewString;}〃在窗口的队列中添加新顾客publicsynchronizedvoidjoinNewCustomerCustomercif!customersofqueue.isFu11customersofqueue.addc;Systemout.println〃jointoagent〃+this.ID+1;。