BUAA_OO第二单元作业总结
一.基于度量来分析自己的程序结构
Homework5
第一次写多线程的程序,评论区助教发的那个月饼的例子让我茅塞顿开。这次我把电梯分成3种,之后发现这样做挺傻的。
waitqueue:是个储存request的表
inputthread:解决输入问题,将输入的request存入waitqueue
elevator:从waitqueue取出request并执行
UML类图

方法复杂度分析





可见elevator的run()方法写的太复杂了。
总结
缺点:用的不是wait+notify,而是半轮询的方法,所以强测的时候有测试点超时。没有写调度器,所以下次作业得写。
优点:捎带功能表现不错。
此次作业并未设计调度器
Homework6
在上次作业的基础上加了调度器,用了wait-notify模式,其他基本没变。那周在忙毕设,星期天下午才开始做,可惜wait-notify有个地方写错了,有些测试点超时210s,星期二debug了一会儿就修复了。
调度器和输入线程inputthread共同拥有waitqueue,输入线程收到request就加到waitqueue里,调度器在waitqueue非空时取出request分配给电梯线程,每个电梯有自己的待做队列。
UML类图

方法复杂度分析




感觉还挺好
总结
缺点:掌握了wait-notify,但只掌握了一点点。
优点:这次作业一下午就写的差不多了,我真棒。
Homework7
最后一次作业感觉梯度变化不大,小改了一下就过了,当时我都震惊了。
3种电梯分别弄成了3个类,调度器里创建了3个列表存这3种电梯,我感觉还挺合理的。
UML类图

方法复杂度分析






看了看schedule里的run(),发现还可以优化一下,分离出一部分功能。
总结
优点:架构清晰。
缺点:没有搞很复杂的调度。
二.分析自己程序的bug
这三次作业的bug主要出现在2方面:进程间的互斥写法和电梯捎带策略。前者已经解决,后者解决了一点,没有完美解决。这次作业还让我学会了多线程调试。
三.分析自己发现别人程序bug所采用的策略
这次大家的架构都差不多,用眼睛看就能找到别人的bug。
四.心得体会
多线程很有趣,工作量可能和上一单元差不多,但是难度我个人感觉简单一点,因为不需要去学如递归下降法之类的我感觉与课程相关性并不大的东西。
经过三次电梯作业的设计与实现,我对Java多线程的设计方法有了明确的认知,同时也对多线程的安全问题有了初步的了解。每次作业的增量,都促使我们对架构设计不断完善,加强对各个模块的封装。
经历了三次作业的debug过程,深刻体会到了线程安全的重要性。应该在设计之前思考好如何设计保证线程的安全。由于自己在写第一次作业时对于线程安全的理解不够充分,就想先完成了整体代码后,再去考虑线程的安全问题,这样给我造成了很大的困扰,

浙公网安备 33010602011771号