OO第二单元总结

第一次作业

完成乘客请求,即对于每个乘客请求(起点层,终点层),需要调度电梯将其完成,并将必要的运行信息通过输出接口进行输出。具体而言,你需要控制电梯上下行,开关门的动作以及控制乘客进出电梯来将乘客从起点层运送到终点层。我们的电梯系统有多部电梯,你需要合理的调度这些电梯来达到更好的性能(第一次作业指定了接送乘客的电梯)。

类图及协作图

架构分析

本次作业采取生产者-消费者模式,InputThread作生产者Elevator作消费者,PassengerQueue为托盘。MainClass启动InputThread,Schedule和Elevator三个线程类,其中,Elevator类启动六个线程模拟六部电梯。而PassengerQueue中以乘客为队列成员,存放乘客信息,PassengerQueue分为所有电梯共用的waitQueue和六部电梯各自待处理的processQueue、电梯内的乘客passengerQueue。

线程启动后,InputThread解析输入字符串,并创造一个乘客实体送入waitQueue,当读取到输入结束标志时,对waitQueue setEnd,并结束InputThread线程。Schedule线程分析waitQueue状态,队列不为空则取出一个乘客,按设定的电梯id将其送入对应电梯的processQueue。当waitQueue为空且已经setEnd时,对所有processQueue setEnd,Schedule线程结束。而每部Elevator分析processQueue中乘客的起始楼层和目标楼层,进行接人操作,分析passengerQueue的目标楼层进行送人操作。每到达一个楼层以此进行开门、接送人、关门、运行等判断。当processQueue为空且已setEnd、passengerQueue为空时,结束Elevator线程。

锁与同步块

本次作业对PassengerQueue中的方法加了synchronized关键字,防止对队列的同时读写。

电梯线程代码展示

第二次作业

完成乘客请求,即对于每个乘客请求(起点层,终点层),需要调度电梯将其完成,并将必要的运行信息通过输出接口进行输出。具体而言,你需要控制电梯上下行,开关门的动作以及控制乘客进出电梯来将乘客从起点层运送到终点层。我们的电梯系统有多部电梯,你需要合理的调度这些电梯来达到更好的性能。本次及以后作业不再指定电梯。

类图及协作图

架构分析

本次作业针对增加的reset功能,增设RstRequesetQueue类和RstRequest对象类,从InputThread中读取reset请求,创建rstRequest对象,放入rstRequestQ中,传给Schedule线程。Schedule类中对乘客均匀分配电梯,并新增对reset操作的处理,将rstRequestQ传给对应的电梯。

而在电梯线程中,在运行部分之前增加reset处理的功能,若rstRequestQ非空则将电梯内passengerQueue中的乘客重新放入waitQueue,重写电梯的capacity和speed指标。此外,电梯线程和Schedule线程的结束标志需要增加rstRequestQ是否为空、是否已setEnd的判断。

由于新增reset操作,电梯内的乘客会放在waitQueue里,因此本次作业中电梯即使消费者又是生产者,而新增的rstRequestQueue则是新的托盘。

锁与同步块

本次作业中PassengerQueue中的方法依旧需要加synchronized关键字来保护,同时,新增的RstRequestQueue中的方法也应该加synchronized关键字,并在方法结束时notifyAll()唤醒。

电梯线程代码展示

心得体会

通过本单元的学习,我初步学习到了多线程程序的编写方法,尤其对生产者-消费者模式有了较为深入的认识。然而在作业的完成过程中,我仅仅实现了对实验架构的改写,没有扩展学习更多的多线程架构方式。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值