面向对象第二单元个人总结

一、作业分析

本单元作业的目标是模拟多线程实时电梯系统

第五次作业:

一共A-E五个楼座,每个楼座仅有一座纵向电梯。

第五次作业分别为主线程、输入线程、调度器线程和电梯线程。电梯采用LOOK策略,电梯运行的具体过程及策略在Process中进行,即先向上再向下,每次在一层或十层的时候便判断能够进行捎带的乘客,将能够捎带的乘客需求放入一个队列,达到该楼层时再根据电梯是否超载决定是否进行捎带,若一次上下运行未完成所以请求,则进行循环,继续运行。

同步块的设置和锁的选择:

RequestQueue设置为线程安全类,利用synchronized同步了addRequest、removeRequest、getRequest、getOneRequest、setEnd、isEnd、isEmpty等方法。

选择使用synchronized,没有使用ReentrantLockReentrantReadWriteLock等方式加锁。

调度器设计:
将Schedule作为调度器,讲不同的乘客需求分配到不同楼座的电梯。
第六次作业:
一共A-E五个楼座,每个楼座纵向电梯和横向电梯,且可以向不同楼座中添加电梯。

第六次作业分别为主线程、输入线程、调度器线程和电梯线程。调度器线程中将不同的电梯增加需求分配到不同的楼座,将不同的乘客需求分配到不同楼座的不同电梯。电梯采用LOOK策略,与上一次作业大致相同,电梯运行的具体过程及策略在Process中进行,即先向上再向下,每次在一层或十层的时候便判断能够进行捎带的乘客,将能够捎带的乘客需求放入一个队列,达到该楼层时再根据电梯是否超载决定是否进行捎带,若一次上下运行未完成所以请求,则进行循环,继续运行。

 

 

同步块的设置和锁的选择:

RequestQueue设置为线程安全类,利用synchronized同步了addRequest、removeRequest、getRequest、getOneRequest、setEnd、isEnd、isEmpty等方法。

选择使用synchronized,没有使用ReentrantLockReentrantReadWriteLock等方式加锁。

调度器设计:

调度器Schedule1、Schedule2将不同的电梯增加需求分配到不同的楼座,将不同的乘客需求分配到不同楼座的不同电梯。

第七次作业:

一共A-E五个楼座,每个楼座纵向电梯和横向电梯,且可以向不同楼座中添加电梯。横向电梯增加可到达楼座的限制,电梯容量和速度可根据输入改变,乘客请求的出发地和目的地可以是不同楼座和不同楼层。

第七次作业与第六次作业相似,只是在个别类中做了改动,整体框架没变,分别为主线程、输入线程、调度器线程和电梯线程。调度器线程中将不同的电梯增加需求分配到不同的楼座,将不同的乘客需求分配到不同楼座的不同电梯。电梯采用LOOK策略,与上一次作业大致相同,电梯运行的具体过程及策略在Process中进行,即先向上再向下,每次在一层或十层的时候便判断能够进行捎带的乘客,将能够捎带的乘客需求放入一个队列,达到该楼层时再根据电梯是否超载决定是否进行捎带,若一次上下运行未完成所以请求,则进行循环,继续运行。

同步块的设置和锁的选择:

RequestQueue设置为线程安全类,利用synchronized同步了addRequest、removeRequest、getRequest、getOneRequest、setEnd、isEnd、isEmpty等方法。

选择使用synchronized,没有使用ReentrantLockReentrantReadWriteLock等方式加锁。

调度器设计:

与上一次作业相同,调度器Schedule1、Schedule2将不同的电梯增加需求分配到不同的楼座,将不同的乘客需求分配到不同楼座的不同电梯。

二、bug分析

1、个人bug

(1)存在当乘客需求过多时,电梯运行一次无法完成全部请求的bug,将电梯改为一直运行直到乘客需求数为0。

(2)存在轮询,通过在循环中打印的方法,找到轮询的位置,再到相应的类中改变锁的设置。

(3)存在共享对象共用的bug,设置多个对象,防止对象共用引起的各种bug。

2、互测bug

在互测中被发现的bug,是由于需求过多引起的电梯乘客只进不出或者部分乘客需求不完成便结束电梯运行的bug,通过修改电梯的策略细节来修复bug。

发现了其他同学的bug,都属于比较低级的错误,如需求过多时需求处理不完全的bug,也有由于需求进入过晚以及需求过多导致的运行超时的bug。

找bug时,主要依靠随机创造数据进行测试,尝试不同的情况与各种极端输入,比如上述的第二个bug,便是对电梯的需求个数和时间要求到了极限,从而对电梯的运行时间做出了极高的要求,进而测出超时的bug。

找bug时与第一单元相比,虽然都是手动构造数据,但本单元更偏向于超时问题、需求未处理等问题,而不是单纯的输出结果错误问题。

三、心得体会

线程安全:

多线程在最初接触时会出现理解困难的情况,对synchronized锁的应用也不熟悉,需要多次在程序中进行摸索和尝试才能稍稍理解正确的用法,哪些需要锁才能被弄明白。而且多线程中需要注意的细节特别多,只要哪一处的锁、方法出现考虑不周到便会造成整个程序运行的错误,以及容易出现轮询问题,修复这些问题非常耗费时间,这就是一系列的线程安全问题。线程安全重要,而且极度需要留意,要处理好各种细节。

层次化设计:

本次单元我的设计层次化并不明显,没有太多的继承、实现,主要还是不同线程之间的协调,各个类之间的连接关系。以后还是要多注重层次化设计。

 

posted @ 2022-05-03 22:30  苏俊行  阅读(30)  评论(0编辑  收藏  举报