总结性博客作业
一、从多线程的协同和同步控制方面,分析和总结自己三次作业的设计策略。
第一次电梯作业(多线程、单电梯、非捎带):
在第一次作业中我一共设置了四个类:
·Homework5类包含主函数,负责实例化进程,并读入请求队列:
·Person类代表每一个人,包含起始楼层与到达楼层和人的id;
·People类存储请求队列,Person的队列,还有一个标志请求结束的标志end;
·Elevator类为电梯,不断从请求队列中读出请求,并执行。在这次作业中,我采用傻瓜调度的方式,并且没有考虑性能,每次只送一个人。
第二次电梯作业(多线程、单电梯、捎带):
·Homework6类包含主函数,负责实例化进程,并读入请求队列:
·Person类代表每一个人,包含起始楼层与到达楼层和人的id;
·People类存储请求队列,Person的队列,还有一个标志请求结束的标志end,比较第一次作业加入了现在在电梯上的人的队列;
·Dispatcher类存为调度器,其中包含判断运行方向的函数,达到捎带的目的,以及上电梯下电梯上人下人的函数。
·Elevator类为电梯,改变了第一次的轮询写法,主要以楼层作为循环条件,进行电梯的调度。
第三次电梯作业(多线程、多电梯、捎带):
·Homework7类包含主函数,负责实例化进程,并读入请求队列:
·Person类代表每一个人,包含起始楼层与到达楼层和人的id;
·People类存储请求队列,Person的队列,还有一个标志请求结束的标志end,比较第一次作业加入了现在在电梯上的人的队列;
·Dispatcher类存为调度器,其中包含判断运行方向的函数,达到捎带的目的,以及上电梯下电梯上人下人的函数。
·Disspatcher类为本单元新增的类,主要是为换乘的功能添加。
·Elevator类为电梯队列。相比较于前两次作业增加了两个电梯。
二、基于度量来分析自己的程序结构度量类的属性个数、方法个数、每个方法规模、每个方法的控制分支数目、类总代码规模计算经典的OO度量画出自己作业的类图,并自我点评优点和缺点,要结合类图做分析通过UML的协作图(sequence diagram)来展示线程之间的协作关系(别忘记主线程)从设计原则检查角度,检查自己的设计,并按照SOLID列出所存在的问题
优点:正确性较高
缺点:
·性能较低
·不能完全保证线程安全
三、分析自己程序的bug分析未通过的公测用例和被互测发现的bug:特征、问题所在的类和方法特别注意分析哪些问题与线程安全相关关联分析bug位置与设计结构之间的相关性
·第一次作业:
通过强测样例,未在互测中发现bug。
·第二次作业:
在调度方法上出现问题,导致电梯在上下都有需求的时候会停止不动,在dispatcher类中的判断方向函数中出现,与线程安全无关,但导致运行时的错误。
·第三次作业:
出现了线程安全问题。
四、分析自己发现别人程序bug所采用的策略
(1)列出自己所采取的测试策略及有效性,并特别指出是否结合被测程序的代码设计结构来设计测试用例
(2)分析自己采用了什么策略来发现线程安全相关的问题
(3)分析本单元的测试策略与第一单元测试策略的差异之处
第一次作业(多线程、单电梯、非捎带):
·第一次作业中我自己写的就是个傻瓜电梯,就只测试了连续输入和程序停止部分,也没有发现bug
第二次作业(多线程、单电梯、捎带):
·在互测过程中发现了自己的bug…所以就利用自己错的数据进行了互测:
·以及发现中测数据中没有有数据经过同一个楼层多次,就利用这个数据也进行了互测。
第三次作业(多线程、多电梯、捎带):
·与前两次作业不同的是,第三次作业中增加了换乘情况,这个点上比较容易出错,所以我重点针对换乘情况进行了互测:
·用第二次电梯作强测的数据进行互测:
·在写程序时,有几个自己测试的样例。
五、心得体会从线程安全和设计原则两个方面来梳理自己在本单元三次作业中获得的心得体会
首先对于设计原则。在最后一次课堂上讲解了这部分内容。在其中,最主要的应该是开闭原则,以及LSP、ISP和DIP这三个子类和父类、实现和接口之间的关系准则。以及其他的重要的设计原则,包括层次化抽象原则,责任均衡分配原则,局部化原则,完整性原则,重用原则,显示表达原则,信任原则,懂我原则等。但我反思,在自己的作业中,基本没有几条原则遵守了,这个在以后要更加注意,否则很容易翻车。
其次对于线程安全问题。虽然非常小心,在第三次作业中我还是在线程安全上出了问题,这也是我在本单元最担心的问题。线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。可见线程安全是非常重要的。多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。但在多线程程序中,我还是很难把握,这个需要提高。