BluZer In solitude, where we are least alone
OO第二单元总结

                                         OO第二单元总结

第五次作业

1, 设计

单电梯傻瓜调度,创建输入线程和电梯线程,再创建一个调度器的类,里面有一个共享队列BlockingLinkedQueue,输入线程调用addPerson方法将请求加入到队列中,电梯线程调用pollPerson方法从队列中取出请求开始运行,对共享对象调度器里面的方法进行加锁;当输入线程读到null时,将调度器Controller里的end置1,电梯取出的请求为空并且end为1,结束程序。

2, 类图

 

3, 度量图

 

4, Bug分析与总结

这次的bug主要可能是电梯还没开始运作程序就结束了,原因就是线程不安全导致的,由于我是在电梯线程内部判断条件退出程序,就会出现奇怪的现象,后面对调度器的setEnd和getEnd方法加锁就好了。这次的作业没有用到wait和notify,俩线程一直在不断扫描,所以CPU的频率就很高,这样不好。

 

第六次作业

1, 设计

这次作业电梯的调度策略为ALS,即顺路可捎带,这次架构较上次有了很大不同,首先新增加的Elevator类,保存电梯现在的楼层,模拟了上楼下楼,人员进出以及开关门,并输出对应的信息;线程ElevatorRun从请求队列中得到主请求,确定接下来电梯的目标楼层,电梯每到某楼,就判断该楼层有没有目标楼层和电梯运行方向一致的请求,有则开门,一开门就让该下的人员OUT,要进电梯的统一在CLOSE之前的瞬间IN,结束方式同上次作业。

2, 类图

 

3, 度量图

 

4, Bug分析与总结

这次强测均通过,但从上面的设计中可以看出我的策略很简单,没考虑很多东西,所以性能也就比较差劲了。同互测屋的各位都很平静,偶尔放一放空刀,不赚不亏还好吧。不过听说有的人的电梯会运行到几百层,由于我的设计是电梯有目的楼层才开始走,故并不会出现这种情况。再说下性能,考虑下现实电梯的运作,理应先处理第一个请求,也就是如果先有1楼到15楼的请求,再有-1楼到15楼的请求,电梯就不会到-1楼去接那个人了,当然,接的话时间会缩短很多,但我选择不接,我觉得这种情况也不会很多,何必呢,写多错多。还有一种情况就是如果有6楼到1楼,还有个1楼到7楼的请求,这时电梯的目的地是6楼,会捎带第二个请求,但电梯到六楼接走第一个请求的人后会直接到一楼,此时那个到七楼还在电梯里,体验糟糕,不符实际,如果先去7楼再去1楼会好很多。还有,这次限制了CPU的时间,如果电梯从队列中得不到请求,则需要wait,如果有新的请求则notifyALL。

 

第七次作业

1, 设计

有三个电梯A,B,C,各自有楼层限制和容量限制,可以统一建模,在内部构造方法中判断是哪部电梯并施加条件。又新增加Person这个类,在其内部有,判断是否需要换乘的方法,对出发楼层和目标楼层进行改变的方法,还有对楼层信息判断属于A,B,C哪个电梯,或者两个电梯共享,或者三个电梯共享,所以,在调度器里建了7个arraylist,分别存储不同的请求,由于是多电梯,为了线程安全,我就不能和上次作业一样在电梯线程里遍历waiter,所以就移到调度器里头。考虑到换乘,在需要换乘还没到达最终目的楼层的人下电梯后,要重新加入到请求队列中,并修改相关信息。判断程序结束退出需要移到调度器里头。

2, 类图

 

3, 度量图

 

4, Bug分析与总结

还好强侧没翻车,互测也没什么好讲的,调度策略也继续沿用上次作业。如果是公共请求就让电梯们自己抢,因为A电梯比较快,如果都被A抢到了就太好了。本来我是这么考虑的,如果给一个三电梯公共请求,三电梯就把他当成自己的主请求,该人员进入某电梯后才把该请求从公共请求队列中删除,如果有一个从15楼到1楼的请求,三个空虚的电梯都前往15楼去,但如果又有了从1楼到-2楼的请求,那就不好了,这种问题还是因为我沿用上次策略所遗留下来的。为了提高电梯的利用率,在某个电梯抢到一个公共请求时,就把该请求从公共请求队列中删掉,加入到该电梯私有队列的头部。当然,我这么写的电梯性能就不会好,考虑的比较简单;这也有架构方面的原因,不会架构,导致对电梯的优化难以进行,就只考虑了比较浅层的捎带。

 

心得体会

1, 线程安全

第二单元开始多线程,线程安全性很重要,主要是对共享对象的操作引发的安全问题。有很多方法可以保证线程安全,我在三次作业中只用到了synchronized,很多很好的方法也没去尝试,感觉不大好,为了学到更多,我觉得在以后的作业中应要尝试不同的方法去解决问题;第6次作业时,我是在电梯线程里面从调度器得到waiter队列,然后对其进行遍历操作,而第7次作业中,这样做就很不合理了,线程安全性失去了保障。在单电梯时有个情况是这样,在0秒时有两请求,2楼到10楼和1楼到11楼,一开始把第一个请求当成主请求,电梯就直接开始运作,而第二个请求还没有进入请求队列,这样就无法捎带了,时间大大增多,然后我在电梯线程每次得到一个主请求后,都sleep1秒,让输入线程有机会把请求存入请求队列中,这样就能捎带了。这方法感觉有点蠢,不知道还有没有更好的办法。。。

2, 设计原则

这三次作业在设计上也没考虑太多,主要是不大清楚好的设计与架构是什么样的,写的有点稀里糊涂,以后需要多多了解。

 

posted on 2019-04-22 17:09  BluZer  阅读(90)  评论(0编辑  收藏  举报