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. Jmeter5.1.1创建一个http请求的压力测试

    1.首先添加一个线程组,在线程组中,配置压力情况 2.然后在线程组中,添加取样器,添加http请求:配置web服务器协议(http/https).服务器名称或IP.端口号.请求方法.路径等参数 3.然 ...

  2. 13. nginx,lvs之一

    摘要: 1.详细描述常见nginx常用模块和模块的使用示例 2.简述Linux集群类型.系统扩展方式及调度方法 3.简述lvs四种集群有点及使用场景 4.描述LVS-NAT.LVS-DR的工作原理并实 ...

  3. Shell 编程中,在循环里使用ssh免密远程执行命令的注意事项

    前提:给自己机器配置ssh免密登录#!/bin/bashcat << 'EOD' > list1234EOD while read linedo if ssh myname@127. ...

  4. 三剑客之awkd的基本使用

    1.awk的使用 1.1 基本的awk执行过程 #passwd文件的第二行的第一列和第二列 [root@xiaojin oldboy]# awk -F ":" 'NR==2{pri ...

  5. Python第5天

    今日学习的主要内容: 数据类型和变量的总结:(可变:列表,字典)(不可变:字符串,数字,元组) 引出集合概念:不同元素,无序,不可变类型 set方法—>集合 add添加:clear清空:pop删 ...

  6. mysql日期 获取本月第一天 获取下个月的第一天

    --获取当前日期 select curdate(); --获取当月最后一天 select last_day(curdate()); --获取本月第一天 select DATE_ADD(curdate( ...

  7. NYOJ37-回文字符串(dp)

    37-回文字符串 内存限制:64MB 时间限制:3000ms 特判: No通过数:88 提交数:177 难度:4 题目描述: 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如& ...

  8. ActiveMQ安装使用与spring整合配置教程

    https://blog.csdn.net/qq_22075041/article/details/77602996

  9. sql优化之concat/concat_ws/group_concat

    原文1:https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc 原文2:https://www.y ...

  10. 一千行ABAP代码实现Windows传统游戏扫雷

    *&---------------------------------------------------------------------* *& Report ZCHENH087 ...