面向对象课程第二次总结性博客作业

1.设计策略

第一次电梯:因为电梯只有一个,而且只需要实现先来先服务的调度策略,因此直接使用BlockingQueue来实现生产者-消费者模型。

第二次电梯:要实现捎带,所以原有的套用BlockingQueue的实现无法继续使用,因此手动通过wait-notify实现了一个支持捎带的请求队列。

第三次电梯:和第二次电梯相比,增加了电梯可以停靠楼层的限制和电梯数量,但是架构上和第二次基本没有区别,因此直接把第二次的代码进行修改就可以了。

三次电梯整体来说都是分成调度器、电梯和输入模块三个部分,其中输入模块已经提供好,因此只需要实现调度器和电梯就可以。我的实现是在调度器里放一个待处理的请求队列,在电梯里维护已经在电梯里的人的集合,电梯在每次到达可以停靠的楼层时去请求队列中选择可以捎带的方法,换乘则通过一种比较原始的方式实现,将需要换乘的乘客载到一楼再进行换乘。

在多线程方面,每个电梯各自具有一个单独的线程,用于维护电梯的运行和搭载乘客,调度器也有一个线程,用于从输入模块读出请求并放入自己的请求队列中。

2.类图与复杂度分析

由于第一次电梯较为简单,第三次电梯是将第二次电梯的构筑直接扩充得到的,因此只展示第三次电梯。

 

总体而言复杂度尚可,其中电梯类的run()方法由于要控制整个电梯的运行,复杂度稍高。

4.bug与改进

第一次作业较为简单,而且对于性能没有要求,只要不出现暴力轮循基本都能通过,因此通过了所有的测试点。

第二次作业出现了一个比较严重的调度bug,在选择主方法的时候,我选择的不是到达请求队列的第一个请求,而是到达请求队列的最后一个请求,因此有两个测试点没有在限制的时间内完成调度。

第三次作业由于是在第二次作业的基础上做的改进,且第二次作业已经比较好的进行了设计,因此也没有出现bug,性能分方面由于简单的采用了ALS调度策略,而且在换乘方面实现的比较差,因此性能分只有85分。

5.心得体会

java编程从单线程到多线程是一个巨大的飞跃,无论是线程安全问题,还是多线程程序调试的问题,都十分的困难与棘手。这三次作业让我对于多线程编程有了一个比较全面的认识。

这三次编程也让我对与课上所讲的各种面向对象的设计模式有了更深刻的体会。

posted @ 2019-04-23 19:16  闫之明  阅读(110)  评论(0编辑  收藏  举报