




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、公交车广告发展史燕山大学课程设计说明书名称:操作系统OS题目:公交车上司机与售货员协调工作模拟班级:07级计算机开发小组:三剑客课题负责人:张浩课题组成员:张浩李康张晓玉姓名学号班级自评成绩张浩07010401012107应用2班A李康07010401011307软件3班B张晓玉07010401013107软件3班B开发日期:2010年1月11日-15日1概述计算机操作系统是计算机系统中最不可缺少的,最常用的软件,也是核心的,最接近于计算机硬件的软件。其特点是内容繁多,概念抽象,因此造成理解困难,掌握不易。本软件的主要目的是通过直观的演示,使学生能够感性的明白掌握多道程序及其进程同步和互斥的程
2、序设计的基本方法。1.1 基本功能利用多线程同步技术模拟公交车系统,实现司机与售票员的同步与互斥关系,即开车时不允许开门,开门时不允许开车,实现每个乘客一个线程同步互斥的上下车。每站随即生成上下车人数,上下车线程实行,先下后上原则。到终点站后,可以统计本次出车的载客人数。1.2 开发计划第一步,进行问题分析,确定需要解决的问题;第二步,进行整体构思与框架设计;第三步,查阅资料,分析所需要设计的程序算法;第四步,进行各种算法及各个细节编码的详细设计;第五步,进行代码调试,修改程序中的错误;第六步,整理总结书写报告,进行答辩。1.3 人员分工张浩:分析构架,核心代码编写;李康:用户界面设计,辅助代
3、码编写,调试;张晓玉:功能测试、书写实验报告。1.4 开发环境及开发工具本程序是以在windowsXPT用Netbean夺口jdk搭建的平台上,以Javaf乍为开发语言进行编写的。使用的开发工具:netbeans.NetBean一台直接提供了应用程序的常见需求,如菜单、文档管理和设置。“NetBeansJ建应用程序是指,仅提供NetBeansF台尚不包含的应用程序部分,而不是从头开始编写应用程序。在开发周期结束时,可以将应用程序与NetBeansff台捆绑在一起,从而节省了很多时间和精力,并且构建的应用程序稳定可靠。使用的开发语言:java.Java是一种简单的、面向对象的、分布式的、解释的、
4、键壮的、安全的、结构的中立的、可移植的、性能很优异的多线程的、动态的语言。其特点主要有:平台无关性、健壮性、面向对象、安全性、分布式。1.5 使用的基本概念和原理多道程序:用户所提交的作业都先存放在外存中并排成一个队列,成为“后备队列”;然后,由作业调度程序按一定的算法由后被队列中选择若干个作业调入内存,使它们共享CP眺口系统中的各种资源。进程:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。线程:操作系统用来调度、分派的最小单位。同步和互斥:临界段:临界段对象通过提供所有线程必须共享的对象来控制线程。只有拥有临界段对象的线程才可以访问保护资源(进行临界区操作)。在另一个线程
5、可以获取对象的访问权。用户应用程序可能会使用临界对象来阻止两个线程同时访问共享的资源发文件等。互斥量:互斥量的工作方式和临界段非常相似,其区别在于互斥量不公保护一个进程内的资源共享,而且还保护系统中进程之间的共享资源。它是通过为互斥量提供一个互斥量名”来进行进程间资源共享协调的。事件:事件对象用于给线程传递信号,指示线程中特定的操作可以开始或结束。除非线程已经收到了这个事件信号,否则它将一直处于挂起状态。当事件对象进入其信号状态时,正在等待该事件的线程就可以开始执行。例如,一个应用程序可以通过事件来通知线程它需要的数据已经准备好。经常利用事件进行线程之间的通信。信号量:信号量与互斥相似,但是互
6、斥只允许在同一时刻一个线程访问它的数据,而信号量允许多个线程在同一时刻访问它的数据。WIN32不知道哪一个线程拥有信号量,它只保证信号量使用的资源计数正确的设置。2需求分析协调司机和售票员以及乘客在运行与开关门以及上下车时的关系,实现同步互斥,避免发生不必要的冲突,节省了时间空间资源。本程序显示上下车人数,并显示车上总人数,使车内人数不超过总座位数。最终,利用统计功能,显示此次公交车运行的各种参数:车次、总站数、总载客数。3总体设计基本的技术路线:面向对象;软件的总体结构:分为可视化界面以及后台数据执行;内部模块关系:司机类与售票员类同步互斥,上车类与下车类同步互斥;总体流程:停车-开门-下车
7、-上车-关门-开车;需要创建的进程线程:主窗口线程、司机线程、售票员线程、上车乘客线程、下车乘客线程流程图如下:开门1创建上F车统程I先下后上L上下车完成X关门I行驶ZL到站7LM4详细设计Wait(),notify()实现进程的等待和唤醒。BusJFrameO建主窗口,Driver(剂Conductor价别创建司机和售票员线程,PassengerOn()|建上车线程,PassengerOff0建下称线程。确定要设计的过程、构件、类、对象、函数和它们的参数,要给出具体的名称和参数及其解释由Driver类调用BusStat或的stopCar()口runCar()!r法,由Conduct。类调用B
8、usStatei的openDoor()和closeDoor方法,实现同步互斥。由Passenger。类调用Seat类的takeOn()口hasOn()T法,由Passenger。类调用Sea楼I的takeOff()口hasOff的法,实现上下车线程的同步和互斥5编码设计5.1 开发环境的设置和建立首先安装JDK如下图:Jawd|FTI)5EDtvrlpMtiKKit6Update13自定义安眠诘hK,州去年选舞舞上装的匚.任力非.上彝完哀后,俗町以使用杉制由也中的友 110味程序突田程序来更改自逸捏的的能C ;1Rwa«i FttesVffJa Wkl ,ft,0. ISLjavaf
9、TM 任 oevebpfuentKit $ 3百上:3.包将专用按£UJUS.E迨将用费KO r匚巾惮器骊动霜亨间.上一步富予一壬工工取消然后安装Netbeans并关联JDK:5.2 程序设计过程只需要注意的事项实现同步互斥的方法应成对出现,防止出现死锁状态;互斥信号应定义清晰,以用于互斥方法的实现;线程的创建和指针传递清晰明确,用于线程之间的交互。5.3 关键构件和插件的使用NetbeanS勺使用与一般编程软件接近,但是它包含了很多强大的插件,利用其中的插件我们可以简单的实现很多复杂的功能,例如在本次试验中恶我们程序的可视化窗口的建立就是利用如下组建实现的。期伴曲相电Xi lw叵工
10、具整_容器;标将把阴格届渐城相之一具面盅格内曾框架巴i分层窗稻5«11£控件曝空工控钿叵开启/光出按天”一复选框4一单选授轴。搦睡口娟合框JTrutl-属性吓学I扁性的定蝌代吗:*星度defaurtClogcOperat沁rEtITjOHLCLO典.v口-ttfeQ-苴W反片aKviyaOnTop口.2fikvoviOnTflDSuDC»rx>dJfianie5.4主要程序的代码设计及注释BusStat类主要源代码:publicclassBusStatepublicstaticbooleandoorClosed=false;publicstaticboole
11、anbusStopped=true;/获取输出框指针privatestaticJTextAreabSay;publicstaticvoidgetBusSay(JTextAreab)bSay=b;/获取输出框指针publicsynchronizedvoidstopBus()busStopped=true;bSay.setText("已停");this.notify();publicsynchronizedvoidrunBus()throwsInterruptedExceptionwhile(!doorClosed)this.wait();busStopped=false;pu
12、blicsynchronizedvoidcloseDoor()doorClosed=true;bSay.setText("已关");this.notify();publicsynchronizedvoidopenDoor()throwsInterruptedExceptionwhile(!busStopped)this.wait();doorClosed=false;packageysu;importjava.util.logging.Level;importjava.util.logging.Logger;Conduct。关的主要源代码:publicclassConduc
13、torextendsThread/获取主窗口指针privatestaticBusJFramebj;publicstaticvoidgetBusJFrame(BusJFrameb)bj=b;/获取BusStat或的指针privatestaticBusStatebState;publicstaticvoidgetBusState(BusStateb)bState=b;/获得一个Driver进程类的指针privatestaticDriverdr;publicstaticvoidgetDriver(Driverd)dr=d;/用于创建On和Off类privatevoidcreateOn()Thread
14、a=newPassengerOn();a.start();privatevoidcreateOff()Threadb=newPassengerOff();b.start();privatebooleantimeToQuit=false;privateintstation=0;publicstaticbooleanfinish=false;publicvoidrun()while(!timeToQuit)trybState.openDoor();bj.busSay.setTexf。已开");Thread.sleep(1000);bj.busSay.setText(null);bj.co
15、nductorSay.setText("抓紧时间上下车");Thread.sleep(2000);bj.conductorSay.setText(null);bj.busSay.setTex邺始上下车");Thread.sleep(2000);bj.busSay.setText(null);Seat.doorAvailable=true;if(Seat.willOn>(Seat.seatRemain+Seat.willOff)Seat.canOn=Seat.seatRemain+Seat.willOff;elseSeat.canOn=Seat.willOn;
16、/统计本次出车载客人次数Seat.totalPassenger=Seat.totalPassenger+Seat.canOn;/创建上下车乘客的进程for(inti=0;i<Seat.willOff;i+)createOff();for(inti=0;i<Seat.canOn;i+)createOn();if(Seat.canOn=0&&Seat.willOff=0)finish=true;elsefinish=false;/等待上下车完成while(!finish)Thread.sleep(100);if(Seat.canOn<Seat.willOn)bj.
17、busSay.setText®抱歉n本车已满n欢迎乘坐下班客车");Thread.sleep(2000);Seat.doorAvailable=false;Seat.hasOn=0;/青零,防止出现累加Seat.hasOff=0;bj.busSay.setText("下车完毕");bj.seatRemain.setText(""+Seat.seatRemain);bj.seatUsed.setText(""+Seat.seatUsed);station+;if(station>Seat.totalStatio
18、n)timeToQuit=true;Driver.timeToQuit=true;break;Thread.sleep(2000);bj.busSay.setText(null);bj.conductorSay.setText("门了");Thread.sleep(2000);bj.conductorSay.setText(null);bState.closeDoor();Thread.sleep(1000);catch(InterruptedExceptionex)Logger.getLogger(Conductor.class.getName().log(Level.S
19、EVERE,null,ex);tryThread.sleep(200);catch(InterruptedExceptionex)Logger.getLogger(Conductor.class.getName().log(Level.SEVERE,null,ex);bj.conductorSay.setTex!("点站至U了n谢谢乘坐本车n再见)bj.willOff.setText(""+0);bj.willOn.setText(""+0);BusJFrame.sumrizeAvailable=true;dr.stop();/* Tochan
20、gethistemplate,chooseTools|Templates* andopenthetemplateintheeditor.* /packageysu;importjava.util.logging.Level;importjava.util.logging.Logger;Driver类主要源代码:publicclassDriverextendsThread/获取主窗口指针privatestaticBusJFramebj;publicstaticvoidgetBusJFrame(BusJFrameb)bj=b;/获取BusStat或的指针privatestaticBusStateb
21、State;publicstaticvoidgetBusState(BusStateb)bState=b;/获取BusStat类的指针publicstaticbooleantimeToQuit=false;publicvoidrun()while(!timeToQuit)trybState.runBus();Thread.sleep(1000);bj.driverSay.setTex咐发");bj.nowNextSation.setTex/一站");bj.nextStation.setText(""+(+Seat.nextStation)+"站
22、");inta=(int)(Math.random()*10);/下车人数不能多于车上已有的人if(Seat.seatUsed<a)Seat.willOff=Seat.seatUsed;elseSeat.willOff=a;/提前创建下一站要下车的人数if(Seat.nextStation=Seat.totalStation)Seat.willOn=0;Seat.willOff=Seat.seatUsed;elseSeat.willOn=(int)(Math.random()*10);胜成上车的人数bj.willOff.setText(""+Seat.wil
23、lOff);bj.willOn.setText(""+Seat.willOn);bj.busSay.setText(null);Thread.sleep(2000);bj.driverSay.setText(null);bj.busSay.setTex解车行驶中");Thread.sleep(3000);bj.busSay.setText(null);bj.driverSay.setTextf"站了");bj.nowNextSation.setText("站");Thread.sleep(1000);bj.driverSay
24、.setText(null);bj.busSay.setTex窜已停");Thread.sleep(1000);bState.stopBus();Thread.sleep(1000);catch(InterruptedExceptionex)Logger.getLogger(Driver.class.getName().log(Level.SEVERE,null,ex);Sea段的主要源代码:/*Tochangethistemplate,chooseTools|Templates*andopenthetemplateintheeditor.*/packageysu;/*authorA
25、dministrator*/publicclassSeatpublicstaticinttotalStation=4;publicstaticinttotalPassenger=0;publicstaticinttotalSeat=30;publicstaticintstationName=10;publicstaticintbusName=30;publicstaticintseatTotal=30;publicstaticintseatRemain=30;publicstaticintseatUsed=0;publicstaticintwillOff=0;publicstaticintwi
26、llOn=0;publicstaticintcanOn=0;publicstaticinthasOn=0;publicstaticinthasOff=0;publicstaticintnextStation=0;publicstaticbooleandoorAvailable=true;publicstaticvoidreset()totalStation=12;totalPassenger=0;totalSeat=30;stationName=0;busName=30;seatTotal=30;seatRemain=30;seatUsed=0;willOff=0;willOn=0;canOn
27、=0;hasOn=0;hasOff=0;nextStation=0;doorAvailable=true;publicsynchronizedvoidtakeOn()throwsInterruptedExceptionwhile(!doorAvailable|hasOff<willOff)this.wait();doorAvailable=false;hasOn+;seatUsed+;seatRemain-;publicsynchronizedvoidtakeOff()throwsInterruptedExceptionwhile(!doorAvailable)this.wait();d
28、oorAvailable=false;hasOff+;seatUsed-;seatRemain+;publicsynchronizedvoidhasOff()doorAvailable=true;this.notifyAll();if(Seat.hasOff=Seat.willOff&&Seat.canOn=0)Conductor.finish=true;publicsynchronizedvoidhasOn()doorAvailable=true;this.notifyAll();if(Seat.hasOn=Seat.canOn)Conductor.finish=true;P
29、assengerOnl的主要源代码如下:/* Tochangethistemplate,chooseTools|Templates* andopenthetemplateintheeditor.* /packageysu;importjava.util.logging.Level;importjava.util.logging.Logger;/* authorAdministrator* /publicclassPassengerOnextendsThread/获得Sea膜的指针privatestaticSeatseat;publicstaticvoidgetSeat(Seats)seat=s
30、;/获取主窗口指针privatestaticBusJFramebj;publicstaticvoidgetBusJFrame(BusJFrameb)bj=b;Overridepublicvoidrun()tryThread.sleep(100);catch(InterruptedExceptionex)Logger.getLogger(PassengerOn.class.getName().log(Level.SEVERE,null,ex);tryseat.takeOn();catch(InterruptedExceptionex)Logger.getLogger(PassengerOn.cl
31、ass.getName().log(Level.SEVERE,null,ex);bj.busSay.append(""+Seat.hasOn+,人已经上车n");bj.seatUsed.setText(""+Seat.seatUsed);bj.seatRemain.setText(""+Seat.seatRemain);bj.willOn.setText(""+(Seat.canOn-Seat.hasOn);bj.willOff.setText(""+(Seat.willOff-Sea
32、t.hasOff);tryThread.sleep(2000);catch(InterruptedExceptionex)Logger.getLogger(PassengerOn.class.getName().log(Level.SEVERE,null,ex);seat.hasOn();Passenger。类的主要源代码如下:/* Tochangethistemplate,chooseTools|Templates* andopenthetemplateintheeditor.* /packageysu;importjava.util.logging.Level;importjava.uti
33、l.logging.Logger;/*authorAdministrator*/publicclassPassengerOffextendsThread/获得Sea膜的指针privatestaticSeatseat;publicstaticvoidgetSeat(Seats)seat=s;/获取主窗口指针privatestaticBusJFramebj;publicstaticvoidgetBusJFrame(BusJFrameb)bj=b;Overridepublicvoidrun()tryThread.sleep(100);catch(InterruptedExceptionex)Logg
34、er.getLogger(PassengerOff.class.getName().log(Level.SEVERE,null,ex);tryseat.takeOff();catch(InterruptedExceptionex)Logger.getLogger(PassengerOff.class.getName().log(Level.SEVERE,null,ex);bj.busSay.append(""+Seat.hasOff+"人已经下车n");bj.seatUsed.setText(""+Seat.seatUsed);bj.seatRemain.setText(""+Seat.seatRemain);bj.willOn.setText
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 提升学生学习动力的教学方案设计
- 人工智能教育在K-12的未来趋势预测
- 智慧城市家具在提升城市形象中的作用
- 2023年度四川铁道职业学院单招《职业适应性测试》能力检测试卷附答案详解(研优卷)
- 大桥的美术课件
- 血管外科第三集讲解
- 三年级数学计算题专项练习汇编及答案
- 浙江省2025年下半年维修电工技师理论考试题
- 2024年南通市第三人民医院招聘笔试真题
- 陈列培训销售课件
- 福建福州鼓楼区小学2025届五年级数学第二学期期末经典试题含答案
- 化工投资项目可研报告编制办法(中石化联产发2025115号)
- 项目管理与工期控制
- 2025年山西云时代技术有限公司招聘笔试参考题库含答案解析
- 自身岗位讲安全
- 新媒体运营实战与自媒体平台选择指南
- 《保密意识培训》课件
- 《家用电器销售管理系统的设计与实现》2000字(论文)
- 湘艺版第二单元《中国音乐》第1课时中国古代音乐教学设计
- 糖尿病的中医科普
- JJF(苏) 50-2024 水泥混凝土稠度试验仪校准规范
评论
0/150
提交评论