第五次作业
有关设计
- 本单元的作业有关多线程电梯的调度,第五次作业只有一部电梯,没有载客量的限制,尽可能高效地响应乘客的请求;
- 采用生产者-消费者模型。调度器内部维护一个用户请求的队列,接收器负责向调度器中放入请求,电梯负责从调度器中取请求并执行;
- 执行过程中采用了LOOK算法,LOOK算法是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处于在电梯运行方向相同的各楼层上的请求,并且当发现电梯所移动的方向上不再有请求时立即改变运行方向。
度量分析
-
UML类图
-
复杂度分析
-
类的复杂度
-
方法的复杂度
可以看出,电梯的run()方法iv(G)较高,是因为这部分负责电梯的运行工作,牵扯到很多方法的调用,所以耦合度较高。
有关bug
本次作业在互测和强测中并未发现bug。
第六次作业
有关设计
- 第二次作业在第一次作业的基础上,增设多部电梯,并增加了停靠的楼层,限制载客量;
- 依然采用生产者-消费者模型和LOOK算法,整体作业在第五次作业的基础上改变了电梯的创建方式和输入部分,其他地方几乎没有改动。
度量分析
-
UML类图
-
复杂度分析
-
类的复杂度
-
方法的复杂度
可以看出,电梯的run()方法iv(G)和v(G)较高,是因为这部分负责电梯的运行工作,牵扯到很多方法的调用和电梯运行工作的判断,所以耦合度较高,结构比较复杂。
有关bug
- 自己的
没有在适当的时候让线程睡觉,结果出错。
第七次作业
有思路未实施,是一次无效作业,不做赘述。
对比和心得体会
- 从第五次作业到第七次作业,难度层层递进,一点点的想法如下。
- 关于作业。整体而言,多项式单元的作业经常因为指导书的要求变动而进行相对较大的改动,而电梯单元的作业架构相同,从第五次到第六次几乎只改动了输入部分。
- 关于多线程。没事的时候还是睡着吧,作业和实验中都有因为线程过于积极致使结果错误的情况。
- 关于方法。尽可能使一个方法实现一个功能,整合调用时也清晰简明,回看代码的时候也非常之舒服啊
(就是生成的类图有点长)。 - 必要的注释很有用,有助于检查代码,自己debug,写总结博客的时候尤其有裨益!