进程同步模拟设计——司机和售票员问题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

附件1:学号:课程设计题目进程同步模拟设计——司机和售票员问题学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2011年1月21日课程设计任务书学生姓名:专业班级:计算机科学与技术指导教师:工作单位:计算机科学与技术学院题目:进程同步模拟设计——司机和售票员问题初始条件:1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。2.实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟公共汽车司机和售票员开关门及行车操作的同步模型。2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日1.课程设计目的与功能1.1课程设计目的:通过课程设计,运用信号量,模拟公共汽车司机和售票员开关门及行车操作的同步模型。1.2课程设计能够实现以下功能:设置信号量,保证以下四点:公交运行的时候售票员不能开车门;公交停下,售票员方可打开车门;公交车门打开时,司机不能开车;公交车门关上时,司机方能启动公交2.需求分析,数据结构或模块说明(功能与框图)2.1需求分析为了保证公交运行的时候车门不能开,应该设置一个表示公交运行的信号量,1表示公交运行在,0表示车已停下;为了保证车门打开的时候司机不能启动公交,所以应设置一个表示车门是否打开的信号量,0表示公交门打开,1表示公交门关上按照以上分析,两个信号量在同一时刻必定相反,由此得到结论:设置一个信号量,1表示车停门开,0表示车开门关2.2数据结构1.Bus类成员变量:intflag表示公共的信号量,1表示车停门开,0表示车开门关方法:publicsynchronizedvoidopen(),表示乘务员开车门的动作publicsynchronizedvoiddrive(),表示司机启动车辆的动作2.Driver类,继承于Thread类成员变量:privateBusc,表示该司机所驾驶的公交是c方法:publicvoidrun(),执行Busc的driver()方法3.Conductor类,继承于Thread类成员变量:privateBusc,表示该司机所驾驶的公交是c方法:publicvoidrun(),执行Busc的open()方法2.3模块说明Bus模块这里主要介绍Bus模块中的open()与driver()方法:1.open():方法open()具有synchronized关键字,表示该方法在执行的过程中,其他方法不能够改变该方法所在对象中所拥有的值,因此保证了时间的同步性。While(车还在开){等待,运用wait()方法}//车停下了乘客上下车车门关上改变信号量flag为0告诉司机车门关上了,可以启动车辆,运用notify()方法2.drive():类似于open()方法,方法drive()具有synchronized关键字,表示该方法在执行的过程中,其他方法不能够改变该方法所在对象中所拥有的值,因此保证了时间的同步性。While(车门还没关){等待,运用wait()方法}//车门关了司机开车改变信号量flag为1车停下,告诉售票员可以开门了,运用notify()方法Driver模块设置count,表示该模拟过程执行的次数,run()方法,执行私有成员bus的drive()方法,执行count次后停止。Conductor模块类似,Driver类,设置count,表示该模拟过程执行的次数,run()方法,执行私有成员bus的open()方法,执行count次后停止。3.源程序的主要部分1.Bus类classBus{privateintflag=1;//1表示车停,门开,0表示车开,门关publicsynchronizedvoidopen(){while(flag==0){try{this.wait();}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(openingthedoor,passengersgetsinandout....);System.out.println(closingthedoor...);flag=0;this.notifyAll();}publicsynchronizedvoiddrive(){while(flag==1){try{this.wait();}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(busisdriving...);System.out.println(busstops...);flag=1;this.notifyAll();}}2.Driver类classDriverextendsThread{privateBusc;publicDriver(Busc){this.c=c;}intcount=10;@SuppressWarnings(static-access)@Overridepublicvoidrun(){intcount=10;while(count--!=0){c.drive();try{this.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}}}}3.Conductor类classConductorextendsThread{privateBusc;publicConductor(Busc){this.c=c;}@SuppressWarnings(static-access)@Overridepublicvoidrun(){intcount=10;while(count--!=0){c.open();try{this.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}}4.测试用例,运行结果与运行情况分析;运行结果通过数次重复性演示,可以看出公交运行与公交车门开关是在同步运行的。运行情况分析通过观察运行结果,无论两个线程谁先启动谁后启用,只要初始状态设置的是“车停门开”,那么一定是售票员Conductor线程先执行,或者初始状态时“车开门关”,那么一定是司机Driver线程先启动。即:Conductorc=hx.newConductor(car);Driverd=hx.newDriver(car);Threadtc=newThread(c);Threadtd=newThread(d);无论这里是:td.start();tc.start();还是:tc.start();td.start();(请注意顺序)只要flag的初始值固定,那么程序输出的结果也是不变的,这刚好体现了同步运行这一概念!5.自我评价与总结:通过这次课程设计,我有以下感触:Java的Thread类以及synchronized关键字能够狠好的处理信号量所引出的一系列问题。本程序在不影响功能的前提下,只使用了一个信号量便完成了任务,不得不说是一个创新之处。通过将两个同步与互斥的操作open与drive封装在Bus类中,实现了线程了互斥与同步进行。通过继承Thread类,并将使Driver与Conductor类实例公共使用一个Bus类型变量,实现了信号量的共用。本科生课程设计成绩评定表序号评分项目满分实得分1学习态度认真、遵守纪律102设计分析合理性103设计方案正确性、可行性、创造性204设计结果正确性405设计报告的规范性106设计验收10总得分/等级评语:注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格指导教师签名:2011年1月21日

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功