OO第二次课程总结

  这三次作业分别是多线程电梯、文件监控器、出租车。这三次作业不是一个主题,但这三次作业都是多线程问题,相比之前的单线程难度有了很大的提升。

第五次作业


  第五次作业是电梯主题的最后一个作业,也是多线程问题的第一个作业。这次的作业对于我是难上加难,因为我电梯的前两次作业都是写的面向过程的代码,所以这一次如果要实现多线程电梯,只有重写这一种办法了。并且在改成面向过程的代码以后在实现多线程这一方面又遇到了巨大的障碍。果然是基础没有打好,以后的路步步维艰。由于时间紧迫,仓促之间重新写出来的代码,一运行就crach,也没有时间debug,所以这次作业没有提交,也是我的第一次无效作业。

第六次作业


  第六次作业告别了电梯,要求我们实现一个文件扫描器。有了上一次无效的经历,我告诫自己:这次无论如何也得写出来。之前吴际老师说过上次的作业是难度最大的,以后作业的难度会一次比一次简单。不知道吴际老师是安慰我们还是怎样。至少我第一次读完这次作业的指导书感觉一头雾水,读完一遍还不清楚它到底要我们干什么。我甚至担心这次不会又无效了吧。后来,我又静下心来读了两遍,我发现这次的问题思考起来要比之前简单。它要求我们监测指定文件的变化,然后按照要求将变化记录下来。所以这次的作业只需要每一条请求一个线程就可以了。这次线程的协同主要体现在对文件状态的获取,监控范围内的文件和目录是各个监控器之间的共享资源,所以会涉及到线程安全的问题,同步控制方法是建立线程安全的文件类。这次指导书也建议我们设计一个快照,用于保存各个监控对象的状态,每次对监控对象进行修改都是和相应的快照进行对比,然后更新快照。由于这次思路比较清晰,实现起来也就比较快了。

  这次作业我写了六个。分别是Count类、MonitorThread类、SafeFile类、Snapshot类、TestThread类、Wenjiansaomiao类。Count类就是一个计数器,记录四个触发器分别触发了多少次;MonitorThread类用于实现对监控对象的监控以及进行相应的任务;SafeFile类用于对文件进行修改;TestThread类是测试线程。

  最后报出来的bug是因为我没有考虑监控对象是目录的情况。我拿到的那个同学的代码也是类似的问题。

第七次作业


  第七次作业是出租车系列作业的第一个作业,听学长学姐们说,之后的作业再也不用熬夜了。可我还是太弱了,丝毫没有感受到这次作业有多简单。我感觉这次的作业和多线程电梯很像,可能是多线程电梯没有写出来的缘故,这次作业的实现也比较困难。但最后还是实现了。线程的协同是控制器和输出和控制的内容之间的协同,同步控制方法是对方法加锁和线程sleep。

  这次作业我一共写了六个类。除了自带的gui类和Main类,我还写了Command、QueueThread、TaxiThread、Schedule四个类。Command类是请求类,包含了请求地、目的地、时间、内容;QueueThread是请求队列类,在这个类里实现输入,里面包含的是请求的动态数组;TaxiThread类是出租车类,成员变量有编号、状态、信誉度、位置坐标,在run方法里实现了四个状态的转换;Schedule类是调度器类,决定了一个请求发出后选取哪辆出租车。

  最后报出来的bug是出租车每走一格不是严格的200ms。其中的原因是出租车每运行一格我就会输出系统当前时间,但是程序运行也是需要时间的,所以输出的时间间隔大于200ms。我找到的别人的bug是他的出租车在等待状态下的运行不是随机的,会在两个点之间鬼畜。一开始我是通过gui界面观察到的,但是这不能作为判定为bug的依据,所以我在他的出租车类里加了一条输出,如果出租车编号是2,输出它的位置坐标。果然他的出租车的位置在两个点之间鬼畜。

总结


  这三次作业全部都是多线程以及线程安全方面的问题。这三次作业让我感受到一开始有一个好的架构很重要,我现在总是想着先把大体的写出来细节问题在缝缝补补。但是有的时候当你基本功能实现完成后,想要补救一些东西是很难做到的。这三次作业完成情况总体来说不理想。但从第五次作业未完成,到第六次作业差不多完成到第七次作业基本上完成,虽然说这三次作业难度在递减,但我觉得也是一种安慰吧。最后三次作业,一定要更加努力,做到一次比一次完美。

猜你喜欢

转载自www.cnblogs.com/mengxiangjing/p/8977625.html