OO第二单元多线程电梯总结

第一次作业

设计思路

Input为输入线程,负责不断读取请求并将读到的请求放入调度器中。

Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采用单例模式。Dispatcher中list为请求队列,over为输入线程结束的标志,当输入线程读到null时,将over设为true。

Elevator为电梯线程,采用傻瓜调度(FAFS)。

代码分析

SOLID原则分析

Input线程负责输入,elevator线程负责取指令执行的单一负责线程比较好地实现。

开放封闭原则不能满足,程序可扩展性较差,增加电梯数量或者实现更复杂的调度算法时需要进行很大的修改。

公测和互测

公测和互测过程中没有被发现bug,也没有发现别人的bug。

反思与总结

多线程第一次作业主要帮助自己理解多线程,没有过多考虑之后作业扩展的问题,程序的可扩展性较差。

第二次作业

设计思路

Input为输入线程,负责不断读取请求并将读到的请求放入调度器中。

Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采用单例模式。Dispatcher中list为请求队列,over为输入线程结束的标志,当输入线程读到null时,将over设为true,elevator为电梯线程,在检查捎带时获取电梯状态。

Elevator为电梯线程,采用可稍带调度(ALS),电梯内部有自己的队列用来存放已经进入电梯还没有出电梯的请求,出电梯后将其从队列中移除。

代码分析

SOLID原则分析

单一负责原则,输入线程和电梯线程地分工和第一次作业基本相同,只是增加了电梯内部的捎带算法,总体上符合类功能的独立性。

开放封闭原则,相较于第一次作业,第二次作业中的电梯类可扩展性较强,如果不想优化实现,可以在此电梯类的基础上进行扩展。但是调度器类如果要实现多部电梯,则需要进行的修改比较大,可扩展性较差。

公测和互测

公测和互测是因为同一个问题出现了错误,如果电梯当前楼层不是主请求(电梯内请求列表中的第一个)的其实楼层,则电梯在移动到主请求的初始楼层的时候也可以进行捎带,举个例子:电梯当前楼层为1层,主请求为1-FROM-5-TO-3,则电梯在移动到5层的过程中请求2-FROM-2-TO-3可以被捎带。这种情况下,当所有捎带请求都已经执行完毕的时候,没有更新电梯的状态,即电梯应该向上运行还是向下运行,目标楼层应该是多少,若没有更新,则电梯列表非空且无法执行主请求,电梯会陷入死循环,造成CPU超时。

反思与总结

第二次作业需要实现可稍带调度(ALS),这部分算法主要在电梯中实现,引进了电梯当前所在楼层、运行方向、是否开门,主请求是否进入电梯等变量,在实现的过程中一些问题考虑不够全面,细节处理不是很好。第二次作业共写了三份代码,感觉结构设计得不是很好,线程之间的交互也做得不太优雅。

第三次作业

设计思路

Factor请求拆分后的因子,内部变量elevator用来表示这部分任务需要由哪部电梯来完成,id为用户的id,fromfloor为这部分任务的初始楼层,tofloor为这部分任务的目标楼层。

Request与输入请求一一对应,即将每个输入的请求重新解析为一个Request,内部变量 ArrayList<Factor> list用来存储此请求被拆分之后的因子。

Dispatcher为调度器,由输入线程和电梯线程共享,采取单例模式,内部变量有一个数组用来存放电梯的请求队列,over用来标志输入线程是否结束。

Input为输入线程,负责不断读取请求并将读到的请求放入调度器中。

List为请求队列,分为从某层向上和从某层向下两部分。

Elevator为电梯线程,采用可稍带调度(ALS),电梯内部有自己的队列用来存放已经进入电梯还没有出电梯的请求,出电梯后将其从队列中移除,基本设计思想与第二次比较相似,在一些地方做了一点改进。

代码分析

SOLID原则分析

单一负责原则,入线程和电梯线程沿用第一二次作业的分工模式,总体上符合类功能的独立性。

开放封闭性原则,经过完善第三次作业中电梯的可扩展性比第二次作业有增强,调度器中的不足指出在于电梯请求列表使用了List而不是Arraylist,可扩展性较差,电梯数目增加时需要修改调度器(当时为什么要选List不记得了......)。

公测和互测

公测和互测中出现了两个问题

(1) 如果电梯在某层开了门,则电梯需要sleep(stoptime)后关门,由于判断条件给的不对,所以出现了电梯开关门之间没有sleep(stoptime)的情况,测评反馈信息:Elevator (name) serves too fast at floor (n)。

(2) 此次三部电梯每部都有最大承载人数的限制,所以可能出现电梯在某层不能将可稍带的用户全部捎带的情况,所以不能在捎带遍历结束之后将这层的数组清空。程序出现的问题,判断从某层向下的捎带之后将该层向下的数组清空,导致有些请求没有被执行就被删除,测评反馈信息:Passenger (number) has not arrived at his/her target floor yet。

反思与总结

程序写完之后一定要自己构造相对全面的测试样例对程序进行测试,不能过分相信和依赖弱测和中测,也不能懒,否则就会出现因为智障问题而强测翻车的状况。

OO第二单元多线程电梯总结的更多相关文章

  1. OO第二单元多线程电梯总结分析

    一.概述 这一部分的作业考察的关注点与上一次的作业有所不同,上一次的考察重点主要集中在输入输出的判定以及多态的考察上面,而这一次是让我们进行多线程程序的调度与开发.这次开发过程中最大的感受就是自己之前 ...

  2. OO第二单元——多线程(电梯)

    OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...

  3. BUAAOO第二单元多线程电梯作业总结

    第二单元多线程作业需要保证线程安全

  4. oo第二单元——多线程魔鬼电梯

    在初步认识了面向对象思想后,立刻进入了多线程的学习,本单元的难点主要是锁的理解,需要保证线程安全的同时防止死锁的发生,也要尽可能缩小锁的范围,提高性能.这一单元以电梯为载体,让我们从生活出发,从电梯运 ...

  5. OO随笔之纠结的第二单元——多线程电梯

    综述 主要任务就是写一个电梯模拟器,读入每一个人的请求然后让电梯把他们送到想去的地方. 从第一次到第三次作业,三次的主要任务都是相同的,但是每次都增加了很多的细节,每次的难度都逐步增长,电梯复杂度和瞎 ...

  6. OO第二单元总结——电梯调度问题

    一.设计策略. 在三次作业中,多线程程序的实现分以下几个步骤: 1. 主线程Main类的创建多个线程. 2. 共享对象的synchronized锁保证线程之间的互斥访问. 3. 采用notifyAll ...

  7. OO第二单元总结——电梯

    在电梯系列的作业中,笔者的整体架构几乎没有发生改变.现介绍如下,对于一个电梯系统,主要的工作步骤就是获取乘客请求.分派请求.执行请求.针对这样的工作模式,笔者设计了Elevator.Uselist两个 ...

  8. 电梯也能无为而治——oo第二单元作业总结

    oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...

  9. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

随机推荐

  1. fdisk 分区及 swap

    使用虚拟机创建挂载点 一,创建 windows 硬盘        创建  

  2. 监测c3动画过渡完成的事件

    监测css3动画完成的事件 transitionend 用法: let element = document.getElementById("slidingMenu"); elem ...

  3. (转)Microsoft Print to PDF

    好像win10.win7 都有

  4. calico

    1. ipinip means what? 2. route 172.22.100.192/26 via 192.168.108.1 dev eth1 192.168.19.0/24 via 192. ...

  5. centos7.4重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  6. hibernate写list到mysql

    用jpa写下面语句执行报错,估计要先手动转成字符串吧,工作忙没继续下去了. public void persist(Goods goods) { Assert.notNull(goods);// go ...

  7. OGRE中Any 类型的实现

    [OGRE中Any类型的实现] OGRE中实现了一个class Any,使用Any 可以在上下文中传递任意类型的数据.其本质实现原理就是通过指针. Any 只包含一个成员变量,类型为 placehol ...

  8. 定时器&改变定时器的执行频率

    static System.Threading.Timer timer; static void Main(string[] args) { Console.WriteLine("Press ...

  9. 使用Log4J收集日志

    一:搭建好Selenium+testNG+Maven环境,可参考 http://www.cnblogs.com/hc1020/p/8602863.html 二:百度搜索Maven仓库,然后搜索Log4 ...

  10. 使用电脑ODBC测试数据库连接方法

    使用电脑ODBC测试数据库连接方法 一.打开电脑的控制面板——管理工具——数据源(ODBC),在用户dsn页面中点击添加按钮,选择IBM DB2 ODBC DRIVER,点击完成. 二.在弹出的配置页 ...