第二次OO总结

分析总结

这一阶段的作业主要练习的就是多线程以及多线程的安全问题.
第五次作业是一个多线程电梯, 虽然还是之前的电梯问题, 但是思路却和之前的几次有了很大的区别
这次的作业捎带的思路和之前完全相同, 难点在于三个电梯和scheduler之间时间的同步, 以及作业的分配问题.
我为每个电梯都设置了一个请求队列, 对于电梯内的请求处理很简单, 直接放入对应电梯即可, 难点就在于电梯外的请求, 选择哪个电梯分配任务的问题, 因为这类的请求不一定能及时地分配出去, 所以我在schduler里也设置了一个队列, 每隔一定的之间就获取这三个电梯的信息, 并把能分配出去的任务分配出去.
其中涉及线程安全的地方主要就是三个电梯的队列以及调度器中的队列, 在同一时刻, 只能有一个线程对这个队列进行操作.

第六次作业是一个文件的监控系统, 对文件的相关操作进行实时的监控, 这个问题和上个次作业有一些不同的地方, 上个作业的线程数是固定的,
而这个作业的线程数是不确定的. 这个作业的难度不算非常的大, 而且作业较为开放, 很多的东西都要自己readme, 最开始出现的困难就是对文件的基本操作不是非常地熟悉. 对于监控对象是文件的的监控较为方便, 较为复杂的是对于文件夹进行监控, 需要对文件夹中的所有文件进行监控.而且还要递归扫描文件.其中涉及线程安全的主要地方,就是监控记录的写问题, 因为多个线程可能同时对一个文件进行写操作, 这样可能就会出问题, 所以需要设置同时只有一个线程可以写文件.

第七次作业是一个多线程的出租车问题, 这次作业的一个难点在于计算两点之间的最短路径, 我选择了进行预处理, 即在程序运行之前计算出任意两点之间的最短距离储存起来, 方便之后的使用, 计算过程大概需要3秒左右的时间.
对于请求, 设置了一个队列, 对队列中的请求进行不断的扫描, 扫描该请求所在范围内的出租车并加入队列中, 直到扫描了3秒, 就将该请求分配给最适合的出租车执行任务. 其中涉及线程安全的主要部分也是请求队列.

度量分析

分析自己程序的bug


第五次作业的bug主要在于分配任务上, 由于时间的不统一, 可能导致调度器分配任务时出现错误.
如果这一点做不好, 就会导致程序每次跑的结果都可能不同, 所以统一几个电梯时间进行分配任务非常重要.
这次作业的公测点全部通过了, 在互测中被人找到一个捎带问题的错误. 经查找后, 发现是判断捎带的逻辑存在着一些问题.
第六次作业的bug的公测也全部通过了, 公测被人报了一个错误, 我感觉这个错误是不成立的, 因为我已经在readme中说的很清楚了.
第七次作业的公测全部通过(公测只测试了输入的格式), 互测中被别人找到了3个错误, 1个crash和2个时间上的错误, crash是由于自己在随机的时候没有处理好, 导致position越界而导致了数组越界而crash, 两个时间上的错误其实是一个问题, 就是时间统一的问题, 即由于线程之间执行时间的误差, 可能会导致的问题.


查找别人的bug

1.最基本的输入测试, 对文档要求的一些最基本的样例的测试
2.边界数据的测试, 例如电梯中时间的上限测试, 楼层20楼和1楼的测试, 文件夹的深度和广度
3.程序的压力测试, 测试比较大的输入是否会导致程序的crash
4.错误输入测试, 一些格式不符合规范的输入是否能检测出来并且报相应的错误
5.一些逻辑比较复杂的情况的测试, 例如电梯中一些同层请求何时判同质, 该按怎样的顺序执行输出, 这里是最容易犯错的地方, 并且bug的隐蔽性也特别高, 不太容易发现, 有时候只有去通读代码, 去理解代码的逻辑才能发现这类错误.

心得体会


这三次作业的难度要比前三次难度要高不少, 由于引入了多线程的机制, 导致bug变得更加复杂, 而且许多的bug不具有复现性.
在做作业之前, 还是一定要认真地阅读指导书, 必须将指导书读透彻, 带着疑问去思考, 并积极地参与到issue中参与讨论. 从其他人的问题中得到启发.
切不可盲目的去编写代码. 这次训练的多线程归根结底其实都是最为经典的生产者-消费者模型, 其中第5和第7次作业用到的都是队列, 生产者向队列中放
请求, 消费者从队列中取请求, 每次只能有一个线程对队列进行操作. 其中最麻烦的地方就在于线程之间时间的同步, 产生的几毫秒的误差都会带来很多的错误.
在代码的编写上, 和前三次作业的编写相比, 思路更加清晰, 明确, 编写的类也要比之前更加合理, 尽量避免了产生god类.

posted @ 2018-05-02 15:29  Challenging666  阅读(186)  评论(0编辑  收藏  举报