oo课程回顾

通过这三次作业的训练,初步掌握了多线程的设计方法。这三次作业让我对这门课有了更深刻的认识,这门课的确是一门重课,不仅是大难度、高强度,还有它的持久性,吴际老师称其为“昆仑课程”毫不为过。这是身体与心理的双重砺炼。虽然开始有些落后与大部分同学,但经过努力追赶,却也紧紧跟上进度了。

第七次作业--出租车的呼叫:

作业内容:

  本次作业模拟出租车的乘客呼叫与应答系统,训练线程安全设计方法,同时应用面向对象分析方法和设计原则来开展分析和设计。

  作业涉及的对象主要是地图、出租车和出租车调度系统。乘客的请求从控制台输入,乘客发出请求后,系统向以乘客为中心的4x4区域内的出租车广播,收到广播的出租车进行抢单,广播有一定的时间窗口,窗口关闭后,系统从所有抢单的出租车中,根据出租车信用和出租车与乘客的距离来选择一辆合适的出租车。出租车服务结束后,需要把此次服务的路径、时间等信息输出到文件中。

作业设计:

  下面这张图片是这次作业的类图。主要的类有出租车Taxi类,调度Scheduler类和地图RoadMap类。从线程的角度看,共有100个出租车线程,因请求而产生的调度线程,主调度线程,输入处理线程和主线程。输入处理线程负责接收控制台输入并处理,主调度线程对每一请求创建一个调度线程,调度线程在4x4区域广播然后选择一辆出租车,出租车服务结束后,调度线程输出信息,然后结束。线程之间的关系可以从后面的协作图中看到。

  RoadMap可以存储地图,找出两点间的最短路径,判断由某点向某个方向是否有路。路径是一个Path对象,由方向+距离表示。作业中每条路的长度都相同,所以就省略了距离信息,只记录方向。Path对象是不可变的,因此是线程安全的。整个程序里只有一个RoadMap对象,但把它设计为不可变对象,因此也是线程安全的,不同的出租车可以同时调用shortestPath()方法。

  由于要输出出租车的轨迹,出租车某一时刻的状态,为了管理这些信息,分别用PathRecord对象和TaxiInfo对象来记录。PathRecord对象是可变的,可以添加新的轨迹。TaxiInfo对象是不可变的。此外,不可变对象还有Request对象,Point对象,这些不可变对象都是线程安全的。

  出租车类有serve(), wander(), rest(), takeOrder()方法,分别对应出租车的服务,等待,停止,接单状态。出租车线程主要与调度线程进行交互,因此,将线程协同与同步控制的重点放在出租车线程和调度线程的设计上。

时序图:

第6次以及第5次作业的类图:

总结:

通过3次作业的学习,对多线程有了更深刻的了解,第九次作业出租车的挑战会更难,所以要一定继续加油。

猜你喜欢

转载自www.cnblogs.com/hanbro/p/8978081.html
oo