OO第二次总结
作业5----多线程电梯
第五次作业是多线程电梯,并且要求满足捎带和运动量均衡的原则。在设计的时候,我的想法就是主要写一个电梯类来封装电梯的属性,比如所在楼层、运动方向、目标楼层、运动量等等,之后在通过一个调度类来调度指令给三部电梯,从而完成电梯的共同运作。
上图中的Request类用来处理需求,主要是检查格式问题、输入值的范围问题等等,之后把处理过的指令传到Queue类中,Queue类储存指令然后分类,再分别存入Global类中,这里的Global是用来储存全局变量的地方,因为考虑到像指令这样的东西难免要被三部电梯去抢用,所以我想把他们存在这里方便锁起来。MultiScheduler是调度器,主要用来检测三个电梯的运动量什么的。因为当时还没有想到把电梯类的三个对象作为参数传入其中,所以导致代码冗长而且出现了BUG。StrDispose类主要的作用是进行字符串的处理,来分解指令,里面存了一些方法去处理字符串,避免写重复的代码。
这次作业我的run函数过于长,因为对于多线程的使用还不熟悉,其实有很多run里面的内容可以提炼到外面的方法中,但又因为害怕出错而放弃了。而且我的时间用了系统的真正的时间没去用假时间,所以在时间上运行之后会I有误差,自己也没做复杂的精度处理,所以在时间的问题上也出了BUG。
作业6----文件监管系统
这次作业是文件监管系统,去监管文件的状态是否发生了变化。因为对于这方面很陌生而且把它想的过于复杂,所以很久之后才动笔去写,写的过程中发现其实这个程序和我想的很不一样,主要是监管目录的那一块,目录的变化要通过里面的文件的变化才能体现,但我发现时已经为时过晚,遂放弃之,导致目录的监管几乎没怎么实现,这一下子导致我被找到了无数多的BUG......
这次作业也是写的不怎么美丽,再处理完请求之后就直接用一个BuildThread的类去生成了一个对应的线程,可以说毫无章法可言,在锁的方面只把输出的部分加了锁。总之写的不好。
作业7----出租车
第七次作业是写一个出租车的调度系统,感觉这个调度系统的功能也比较完善,可以支持最短路径,并且用上了信用度的概念。我这次作业把主要的东西都放到了Taxi类中,这也导致我的Taxi类过于庞大,测试者也就这个问题报了我的设计缺陷,引以为戒。
上图中的ReadMap用来读地图并且去检测地图的格式是否有问题,Request类用来读入请求并检查请求的格式,Scheduler类用来接收请求并对每一个请求生成一个对应的线程,其生命周期为3s。在程序开始时,我先生成了100个出租车线程让他们随意的去跑,之后Scheduler类生成的线程回去检索这100个出租车构成的队列,寻找是否有出租车并且找到最优的那一个,并且调度线程可以改变出租车的运动状态,并将一些参数,比如时间、出发地和目的地等传入其中,这次在时间上我用了假时间,这样在测试中可以保证时间是以200ms稳定递增的。
在搜索最短路径的问题上我借鉴了给的GUI里面的bfs算法,因为这个算法跑遍地图上6400个点的时间太长,所以我只在需要的时候去跑一个特定的点。每收到一个指令,其实只需要去跑出发点和目的地两个地方,所以我把它们分别放到出租车和调度器的等待时间中去跑,以避免出现很大的时间误差。
输出方面我也是分别放到调度器和出租车中去输出,分别输出乘客的信息和出租车的信息并存入到一个文件中去,给输出的代码块上了锁,防止某个输出输出到一半被打断。输出到一个文件的时候由于可能同时存在多个出租车,所以并不是按照一辆车一段输出而输出的,会很杂。
总结
从开始对多线程的一头雾水到现在能够勉强使用它并跑出比较正确的结果,我觉得已经算是不小的长进。上次OO上机的时候用到的新东西给了我很大的启发,也让我明白到自己现在掌握的多线程的知识还只是九牛一毛,距离真正的在大型工程中去应用还差了很远。所以我在想下次写作业能不能试着用一些除了sleep,start,sychronized之外的东西来充实自己的多线程。