oo第二单元总结

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

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

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

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

 

(2)    基于度量来分析本身的程序结构。测试

 

第一次电梯做业:类图:优化

方法以及类的复杂度:spa

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

 

第二次电梯做业:类图:设计

方法以及类的复杂度:3d

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

 

第三次电梯做业:类图:

方法以及类的复杂度:

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

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

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

 

(3)    分析本身程序的bug,分析未经过的公测用例和被互测发现的bug。

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

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

 

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

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

 

 

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

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

相关文章
相关标签/搜索