一、三次作业的设计策略
三次作业中我没有采取很大的重构方式,都是使用了四个类,一个MainClass类,作为程序运行的主类,一个Customer类,用于输入数据的处理和请求的生成,一个Tray类(在第三次中命名为Channel类),作为生产者和消费者之间的托盘,同时在第二次和第三次需要调度多部电梯的情况下提供调度和分配请求的功能,最后一个是Elevator类,模拟电梯的运行。作业中主要使用了生产者与消费者的架构方式,而在第三次作业中开启新的线程食是在托盘类中实现的,借鉴了观察者模式的技巧。而对于电梯的运行使用了ALS的调度方法,但是在每一层都进行了是否上下电梯的捎带检查。
此外我认为这次作业中的一个比较大的难点在于如何判断去结束线程,以第三次作业为例,需要在没有了新的输入请求、已经有的所有请求全部处理完、没有换乘请求的情况下结束线程,在写程序的时候在这个地方遇见了一些问题。
二、设计的可拓展性
对于我的程序架构,比较满意的是第三次作业中对于换乘的处理和对于线程结束的处理方式,即在托盘类中就进行请求的分割,将所得的前半个请求丢入需要处理上车的队列,而后半个请求放入缓存区备用,当前半个结束运行后,将后半个唤醒,放入对应可满足需求的电梯处理中,这样电梯类只需要做好自己运行的工作就行,不用考虑是否能接到或者能送到,此外就是对于结束线程的判断变得清晰和简单了许多。这次作业比较简单,只需要一次换乘就可以实现,后面如果要进行拓展而多次换乘,就需要更多的优先级来一次唤醒,需要升级关于分解请求的算法。此外如果后期有电梯突然坏掉需要停止线程的情况,未处理完的请求同样需要进行分解之后按照优先级处理。在我看来主要的拓展方向就是在以上两个方面。
三、基于度量分析自己的程序结构
关于我的程序结构,三次作业的作业类图和度量分析图如下:
作业一:
作业二:
作业三:
四、对于自己和别人bug的分析
我个人的话是第二次和第三次出现了bug,非常没有借鉴意义,第二次是关于数组的遍历写的时候出现了问题,导致该上车的没有上车,该下车的没有下车,运行时间大大增加,从而使得有一个评测点超时了。第三次手抖答错了一个楼层数字,导致换乘上出现了很大的问题。一点感想就是以后要自己多做测试,多构造数据来避免这种令人无语的bug出现。
在阅读别人代码和与其他同学交流的过程中,别人的bug也大多出现在如何结束线程的部分,和比如第一次作业中吞掉第一个请求的问题,感觉多线程编程就是要想要架构和细节线程的处理再动手去做,debug难度较大,且知道bug在哪里也难以修改。
五、感想
这一单元是多线程的入门部分,学到了很多东西,对多线程设计原则,设计模式等也有一定的了解,能够编写多线程程序了。但是关于锁的机制和如何更好地线程安全并兼顾性能还有很多需要学习的地方,感觉就是做出来作业就万事大吉了。对自己的要求不是很高,没有去细想如何优化,此外自己的测评做得不到位就出现各种白给bug,并且在hack别人方面也做的很差劲。希望下一单元可以改正这些问题。