一、度量分析程序结构
1. UML类图分析
1.1 第一次作业UML类图
1.2 第二次作业UML类图
1.3 第三次作业UML类图
1.4 分析结构
在多线程的第二单元里,我三次作业代码的代码结构前两次十分相似,最后一次有了一些进步,在电梯内部声明定义了一个控制模块用来和容器交互。我觉得我对于多线程的理解到现在为止也不算太好,进程之间的等待和通知还需进一步理解。
2. MetricsLoaded代码分析
2.1 第一次作业
2.2 第二次作业
2.3 第三次作业
2.4 代码圈复杂度分析
第一次和第二次代码结构相似,电梯类内部的run函数复杂度很高,因为当时实现的时候,把电梯所有的调度,转向,上下乘客全部写在了一起,所以v(G)就会很高。
在第三次作业中,将调度分离,写在了一个调度器类里,复杂度就随之下降了。
第一次和第二次作业较高的圈复杂度也意味着更高的维护复杂度,所以在第三次作业增加电梯时就进行了重构- -
3. Statistics代码分析
3.1 第一次作业
3.2 第二次作业
3.3 第三次作业
3.4 代码量分析
三次作业的代码量在逐渐增长,在第一单元的三次作业中,我几乎没有编写注释,这给日后的维护带来了很大的麻烦,我会在以后的作业中注意这个问题。
二、漏洞分析
1 第一次作业
在这次作业中,出现的问题是在主线程(输入线程)中采用了轮询的方式查看电梯线程是否结束,这样的方法导致了电梯线程可能在下客完毕之后,未关门之前就被主程序结束。
2 第二次作业
在这次作业中,出现的问题和第一次非常像,也用了相同的办法处理。
3 第三次作业
在这次作业中,又出现了关不上门的情况,多电梯之后,代码变得比较复杂,之前在主程序里的判断由于我加锁方式复杂,不太奏效,最终采取了室友的方法,在电梯内部进行进程终结。
三、互测方法
手玩数据点
四、总结
通过这个单元的学习,我艰难地完成了多线程编程的入门,这些在多线程中新出现的概念,比如同步、锁、原子操作,理解容易,运用起来非常困难。在这个单元踩了许多坑,也学到了一些知识。学到了怎样把一个不线程安全的类如ArrayList,通过包装使其变的线程安全。我的多线程编程能力还十分不足,应该多阅读高质量代码以求进步。