BUAA OO第二单元作业总结

第二单元作业总结

一、同步块和锁的设置

  为了使多个线程之间有条不紊、相互不受影响地运行,我们需要设置同步块和锁。同步块和锁我是使用了实例方法同步和静态方法同步相结合的方法。由于多线程需要共享临界资源,在线程使用临界资源时,我们只允许唯一一个线程使用该临界资源,因此,我们在同步块中加锁实现同步。实例方法同步和静态方法同步两种同步方法都使用synchronized关键字,同时只允许一个线程执行同一个类中的静态同步方法。

二、调度器设计

  在多部电梯同时运行时,需要有相应的调度规则来调度电梯分配请求。本单元作业我使用的调度规则是集中式调度:多个电梯线程共享一个队列,需要使用该临界资源时,多个线程之间相互竞争,从而实现请求的分配。

三、架构分析

  (1)第二次作业

类图:

 

 

 作业中一共包含两类线程:输入线程和电梯运行线程。MainClass主函数中存放输入线程,作为生产者将商品,也即请求,放入传送带队列WaitQueue中。电梯作为消费者,将队列加锁,并取出商品,也即请求。Person是请求类,ProcessQueue是电梯里需要处理的队列。WaitQueue和ProcessQueue都有相应增删改查的方法,不同的是,WaitQueue还有进程结束的标志,电梯进程就是通过这个标志和自己的运行状态来判断线程是否应该结束。

  在电梯线程中,我定义了很多函数来控制电梯的运行,例如上楼、下楼、开门、关门、到达每层的处理、判断是否开门、请求进入电梯、人出电梯等函数,逻辑较为清晰,为后面代码的迭代修改与优化作了很好的铺垫,不需要修改太多代码就可以完成后面的作业要求。

  (2)第三次作业

类图:

 

 

 第三次作业的要求是电梯的型号不同,电梯的可到达楼层、运行速度和最大可搭载人数随着电梯型号的不同而不同。因此,我定义了三个电梯类Elevator、Elevatorb和Elevatorc,分别对应电梯三个不同的型号A、B和C,并修改相应请求可进入电梯和电梯运行结束的条件,让符合电梯条件的请求进入电梯,不符合的不进入。

四、Bug分析

  在第三次作业本地测试的过程中,我发现在一定条件下会造成轮询,也就是在while(true)中无限地循环,且其中没有wait()。仔细阅读代码后发现,在没有符合B、C电梯的请求时,B、C电梯的run()会不断循环运行,不会进入wait()的状态,于是我添加了进程wait()的相关条件,相关的轮询问题就被解决了。

五、心得体会

  本单元作业中,线程安全是最大的一个难点,深入理解有点困难。做程序设计的时候,需要了解每一个线程会使用的对象,最重要的是列出可能存在线程共享的对象,并通过对他们加锁来实现线程安全。对于多线程编程方式的使用以及线程安全的维护和程序算法的优化还是需要多加练习的。

  在架构设计方面,因为第二次作业写的结构比较清晰,可扩展性较好,所以在写第三次作业的时候稍作修改就可以了。以后做作业也要注重结构的安排,遵循设计的原则,增强可扩展性。

posted @ 2021-04-25 22:45  y123h  阅读(66)  评论(1)    收藏  举报