本单元的内容是多线程电梯。
第五次作业分析
第五次作业较简单,我的做法是主线程作为输入处理线程,电梯一个线程。主线程往请求队列里添加请求,电梯一个一个取请求,然后依次处理,本次没有考虑捎带。
本次作业并没有考虑线程安全问题,只是把装请求的容器换成了Vector。
方法复杂度:
方法复杂度都比较低。
第六次作业
第六次作业相比前一次的增加了捎带,提升了电梯的性能。我在整体结构上增加了一个调度器,用于给电梯分配请求,并且给电梯封装了up,down,open,close等方法。使程序的可读性更好。
这一次的评测限制了CPU时间,所以必须使用wait和notify来进行线程控制。
方法复杂度:
本次增加了调度算法,所以方法复杂度比上一次稍微高了一点。
同步控制
由于本次新加了一个调度器,主线程以及电梯线程都需要访问调度器,考虑到线程安全问题,把调度器的方法都设置为synchronized方法。
第七次作业
本次作业的三部电梯,部分请求需要换乘以及电梯的载客量有限制。我新加了Person类代替原有的PersonRequest类以便更改请求。其他地方的修改并不是很大。
复杂度:
本次的方法复杂度控制得并不是很好。
BUG分析
前两次我在强测和互测都没有出现BUG,但在第三次出现了比较严重的BUG。出bug原因的是:我将最后一个输入的请求是否到达作为了判断程序结束的条件,这显然是有问题的,但我在过了中测之后就没有再做测试,没有发现这个bug,导致强测挂了很多点。
这也提醒了我在后面的作业中,对自己的程序进行充分测试是必不可少的。
互测
我在互测的做法是随机生成数据测试,但是没有进行定时投放,所以效果并不是很好。
心得体会
本单元学习了java多线程编程,让我对线程的理解更加深入,同时面向对象的思想也有了一定的提升。最后一次作业的bug也让我意识到了测试对验证程序正确性的重要性。