oo第二单元总结

(1)    从多线程的协同和同步控制方面,分析和总结三次作业的设计策略。

第一次作业:傻瓜电梯;按照先来先服务的原则,没有考虑捎带的情况,实现起来较简单,主要是两个线程和一个请求队列,一个输入线程,一个电梯线程;请求队列可以看成在电梯内;输入线程将请求送进请求队列中,电梯线程不断从请求队列中取请求,两者用synchronized互斥,根据请求运行,若请求队列为空,则wait直到有新的输入请求送进请求队列中;输入终止标志则是以输入请求0-FROM-0-TO-0为标记,读到此请求即break循环。

第二次作业:ALS(可捎带电梯);捎带与一些主请求运行方向相同的请求,但这次作业,忽略了一个重要的方面(当主请求未在电梯中,上下楼层去接主请求时,电梯一味的向上或向下运行,忽略了可以接人),导致运行时间非常的长。和第一次作业一样,主要是两个线程(一个输入线程,一个电梯线程),一个请求队列,一个捎带队列和一个主请求;这次请求队列和捎带队列在输入线程和电梯线程中充当缓冲区的作用;输入线程将请求送进请求队列中;电梯线程每运行到一层,先判断是否更新主请求,根据主请求,判断请求队列里面是否有可捎带的,有捎带的话就将该请求加入捎带队列,然后判断捎带队列里面是否有在该楼层in或out的请求,判断是否在该楼层停靠,停靠一定时间再更新捎带队列,判断是否在楼层停靠期间有新的请求加入(以该楼层为起点的请求);输入终止标志则是以输入请求0-FROM-0-TO-0为标记,读到此请求并且捎带队列和请求队列里面没有请求的话就break循环。这次作业只用到一个对象锁,即请求队列的对象锁,保证输入线程送进请求进请求队列,电梯线程判断是否请求队列中有捎带请求互斥以及当捎带队列里面无任何请求时wait请求队列的更新。

第三次作业:多部多线程可捎带电梯;这次作业通过第二次作业互测环节阅读他人代码吸取了其他人设计的优秀之处,使得代码架构得到了优化。这次作业用了四个线程(三个电梯线程,一个输入线程,三个电梯线程用了同一个类),三个请求队列和三个捎带队列(每一部电梯有一个请求队列和捎带队列);请求队列和捎带队列在输入线程和电梯线程中仍然充当缓冲区的作用;输入线程在输入请求时判断请求需不需要换乘,提前换乘,然后再将请求给送进相应的请求队列,即提前指定请求需要乘坐的电梯,这是一个可优化点,但没有想到好的架构;相应的电梯线程就根据请求队列运行,需要判断请求结束后是否有换乘,将换乘请求送进相应的请求队列,这次作业与第二次作业思路基本一致但将第二次作业可捎带电梯中被忽略的点给优化了(实现了当主请求未在电梯中,上下楼层去接主请求时,电梯可以捎带接人);这次的结束标记也添加了电梯是否还有换乘请求需要送进请求,没有换乘请求才能结束(加入一个换乘请求的计数,每当输入请求有换乘即加一,每当将换乘请求加入相应的请求队列中即减一);这次用到了四个对象锁,三个请求队列锁,与第二次作业作用一致,一个object锁,用于实现输出的互斥。

 

(2)    基于度量来分析自己的程序结构。

 

第一次电梯作业:类图:

方法以及类的复杂度:

第一次作业方法和类复杂度较低,类与类之间联系也较小。

 

第二次电梯作业:类图:

方法以及类的复杂度:

第二次作业电梯运行与电梯运行时需要得到请求这两个方法复杂度较高,也导致了电梯类与请求类的循环复杂度较高。

 

第三次电梯作业:类图:

方法以及类的复杂度:

第三次作业电梯运行与提前判断请求是否换乘,得到相应的乘坐电梯序列这些方法复杂度较高,导致了电梯类与judge类的循环复杂度较高。

优点:三部电梯均为ALS电梯,电梯与电梯之间耦合性小,优化了第二次作业,实现了当主请求未在电梯中,上下楼层去接主请求时,电梯也可以捎带接人。

缺点:提前指定相应的电梯,若电梯满员只能等待,未能和电梯线程进行交互,未能做到电梯抢夺请求,而是请求送往电梯;可扩展性不强,当有电梯需要停止运行时,架构需要较大的改变;电梯线程和请求队列之间耦合性大;以及第三次作业有些方法和类的复杂度太大。

 

(3)    分析自己程序的bug,分析未通过的公测用例和被互测发现的bug。

在自己找bug阶段,第二次作业主要是架构未想好就上手写,自己的架构改了又改;第三次作业bug主要存在与电梯线程终止的判断中,需要考虑到换乘请求。

在公测和互测中均未被发现bug。

 

(4)    分析自己发现别人程序bug所采用的策略

以第三次作业为例,首先对多电梯楼层间运行时间,开关门时间和电梯容量等进行测试,然后构造一些特殊的需要换乘的请求对别人代码进行测试;还有就是阅读他人代码,根据对共享资源的操作,判断线程的安全性,也能学到新的知识。本单元与第一单元测试策略的差异之处在于这次是多线程作业,所以线程安全是一个非常重要的,检测bug的点。

 

 

(5)    心得体会从线程安全和设计原则两个方面来梳理自己在本单元三次作业中获得的心得体会。

通过这三次作业,学到了很多关于多线程的知识,从完全没有多线程的概念,到能够设计出多线程ALS电梯;同时学会了synchronized这一锁机制,能够较灵活的应用,在这三次作业中,除了开关门,电梯在楼层中运行这些是固定时间,需要用到sleep外,其他都是通过notidyAll与wait来实现的;当多个线程对共享资源进行操作时,需要实现互斥,否则线程不安全;同时,在程序能够过中测后,也养成了一个习惯,对代码再次进行分析,判断线程是否安全,能否找到自己的bug.

posted @ 2019-04-23 21:55  pyb1999  阅读(174)  评论(0编辑  收藏  举报