OO第二单元总结

                       2019北航OO第二单元

1.  第一次作业

 

1.1实现思路

    第一次作业需要完成的任务为单部多线程傻瓜调度电梯的模拟。总体来说傻瓜电梯调度坑点不多。采用了生产者消费者模型,输入为生产者,电梯为消费者。把输入作为一个线程,电梯作为一个线程,共享调度器资源(也就是请求队列),其中对电梯上下,开关门的操作是在电梯线程中完成的。将输入的请求保存到共享的请求队列中,然后电梯从请求队列取出一条请求执行。

 

1.2代码分析

UML类图如下

 

 

本意想写一个单例模式,但是没写好多谢出来一个Single类,虽然没有影响性能但是架构的不好。

Metrics分析

 

 

 

 

 

1.3bug分析

    由于傻瓜电梯没有坑点所以强测和互测都没有找到bug也没有找到别人的bug。

 

1.4总结

    虽然这次作业并不是很难,但是由于刚刚接触线程,所以还是遇到了一些问题的,不过后来一点点解决了,这也使我进一步理解了进程,算是一个过渡阶段。

 

2.  第二次作业

2.1实现思路

    第二次作业需要完成的任务为单部多线程可捎带调度电梯,相比于第一次作业多了一个捎带过程。我的架构还是,输入作为一个线程,电梯作为一个线程,调度器中保存着二者共享的请求队列,其中电梯线程中多了一个自己的请求队列。这次作业还是把关于电梯的调度放在了电梯内部处理(这为第三次作业带来了很大困难)。输入请求保存到总的请求队列中,当电梯的请求队列为空时,从总请求队列中取出第一个作为主请求,执行。在执行主请求的过程中,电梯每到达一层,就在电梯请求队列中找是否有人要出,在总请求队列中寻找是否有可捎带的请求,如果有进行捎带。

2.2代码分析

UML类图如下

 

 

Metrics分析

 

 

 

 

 

2.3bug分析

    强测挂了3个点,互测中被疯狂hack,后来找了一下问题,发现是调度上的问题,在某种情况下电梯停不下来!疯狂向上或者是疯狂向下。为了让电梯正常捎带,当前电梯在1层,主请求为7层到1层,电梯在上楼这个过程中需要捎带一些向上的乘客,也就是电梯开始的状态是向上运行的和主请求不一致,当我们接到主请求且把电梯中的向上捎带都送到了目的楼层,我要将电梯的运行方向反转一下,也就是和主请求保持一致,这个地方我写了很久!最后还是没判断好!又错了!因为判断条件写的太局限了。

    互测中也没找到其他人什么bug,主要是通过对一些易错类型进行测试,只测出来几个人。

 

2.4总结

    第二次作业我重构了3次!本来是打算为下次作业做准备,然而因为太菜了,一直在错!后来换了一种方法,又出现了线程安全问题!最后不得不放弃,沿用第一次的傻瓜电梯,勉强算是过了中测,强测还是崩了。对线程和线程安全等问题还不是完全理解,所以在写代码的时候才会遇到各种问题且很难解决。

 

3.  第三次作业

菜的真实,没写出来。还是架构的问题,不太清楚要怎么进行调度和请求分配,以及锁也不是很会用,这些问题在第一、二次都勉勉强强过了,在第三次作业中全部成为摆在我面前的障碍。

 

4.  总结

关于测试和bug,就像很多人用“玄学”来形容线程,它一旦出现bug是很难复现的,可能这次对了,下次就错了,也很难进行调试。总之一旦线程出现错误,总是令我抓狂,我要用很长的时间来修复这个bug。最后就是我线程这部分知识学的不太好,到现在还对很多概念和知识一知半解,一到实际应用就有更多的问题了。还要花更多时间来好好学!

posted @ 2019-04-23 19:09  bwt  阅读(109)  评论(0编辑  收藏  举报