(1)设计策略

电梯第1次作业是一个傻瓜调度电梯,使用先来先服务原则,不用考虑捎带(可以认为电梯的载客量为1),因此比较简单,调度器用一个队列就可以。

使用生产者-消费者模型,输入线程是生产者,电梯是消费者,

除了主线程之外有两个线程,电梯线程和输入线程,输入线程负责在接收到请求后加入到调度器队列的队尾中,调度器通过队列实现,电梯线程负责从调度器的队头取出一个请求,然后走到请求的出发楼层,开门、上人、关门,然后走到请求的到达楼层,开门、下人、关门。

在调度器为空,且输入线程停止(遇到EOF)的时候,电梯线程停止,程序结束。

总体来说比较简单,在强测和互测环节中没有发现bug。

第二次作业是一个可捎带电梯,并且有负数楼层,不用考虑电梯的载客量。

我的调度方案是参考现实情况下的电梯,走到需要到达的最高层(考虑请求出发层和电梯内请求的到达层)后,折返,走到需要到达的最低层,然后再折返,运行期间在需要停靠的楼层(电梯内有人要到达该楼层,或者该楼层外面有人需要上电梯)停靠。

除了主线程之外有三个线程,电梯线程、输入线程、调度器线程(相比第一次作业而言新增),调度器线程负责在接收到请求之后把该请求放到相应的楼层数组中,并且计算出折返的楼层。

第三次作业比较复杂,三个电梯,有载客量的要求,每个电梯可以停靠的楼层不同。

我基本参考了第二次作业,调度算法也是和第二次作业差不多,但是对于不可直达、需要换乘的请求,我的思路是先把这些请求送到1层或15层,然后让这些请求到电梯外(相当于在1层/15层投放了请求),之后另一个电梯过来把请求带到相应的终点。

(2)度量

第一次作业:

第二次作业:

第三次作业:

可以看出,复杂度较高的是Elevator.run()和Tray.run(),是由于在这些方法中,我用了特别过程化的方式,这里确实有可以改进的地方。

(3)分析bug

前两次作业的强测和互测都没有发现bug,但是第三次作业强测和互测都被发现了TLE的bug,是因为程序最后停不下来导致的超时,在输入线程停止的时候对电梯线程处理不当造成的,这也是我考虑不够全面,以及本地测试不够全面造成的。

(4)发现bug的策略

由于多线程程序测试的难复现性,以及多线程程序与单线程程序的不同,我在本地测试的时候参考了这个帖子:

https://course.buaaoo.top/assignment/56/discussion/157

项目地址:https://github.com/Mistariano/buaaoo-elevator-test-suit

这个程序替换了原来的IO接口,可以定时投放请求,这样就可以进行黑箱测试了。

(5)心得体会

这几次的作业是有关多线程的,在思路上就与单线程的程序有很大的不同。我经历了第一单元的单线程作业之后,已经有了面向对象的思想,使得我在第二单元的作业中不会再出现特别面向过程的程序。这次作业的难点是要考虑线程安全,通过synchronized同步语句(但同时也要避免互锁),以及一些线程安全的类和方法,解决线程安全的问题。

2019OO第二单元总结的更多相关文章

  1. 2019OO第二单元作业总结

    OO第二单元的作业主题是模拟电梯. ---------------------------------------------------------------------------------- ...

  2. OO第二单元作业小结

    前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...

  3. BUAA面向对象设计与构造——第二单元总结

    BUAA面向对象设计与构造——第二单元总结 第一阶段:单部傻瓜电梯的调度 第二阶段:单部可捎带电梯的调度 (由于我第一次写的作业就是可捎带模式,第二次只是增加了负数楼层,修改了一部分参数,因此一起总结 ...

  4. 我永远爱着OOP——第二单元作业总结

    第二单元的电梯真是愉♂快呢,多线程编程作为java编程OOP中的重要组成部分,通过这一个单元的学习,我也是有了很多全新的认识 那么下面就先例行一下公事 三次作业分析 第五次作业 设计分析 实现的电梯是 ...

  5. oo第二单元作业总结

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

  6. OO第二次博客作业--第二单元总结

    第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...

  7. 第二单元电梯调度作业 By Wazaki

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

  8. OO第二单元总结(多线程的电梯调度)

    经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...

  9. OO第二单元电梯线程系列总结作业

    电梯系列第一次作业 功能描述: 傻瓜电梯无需考虑超载捎带 线程模式: Producer-Consumer Pattern 思路: 第一次作业是一个傻瓜电梯,分别有一个生产者生成电梯指令(也就是Inpu ...

随机推荐

  1. Pytorch 常用函数

    1. torch.renorm(input, p, dim, maxnorm, out=None) → Tensor Returns a tensor where each sub-tensor of ...

  2. percona-toolkit 之 【pt-online-schema-change】说明【转】

    背景: MySQL 大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响.在5.1之后随着Plugin Innodb的出现在线加索引的提 ...

  3. MySQL问题汇总

    1.中文乱码 连接设置: 数据库设置:

  4. java接口自动化基础知识(一)

    一.TestNG+MySQL+MyBatis实现对测试用例数据的读取 本篇文章讲解TestNG+MySQL+MyBatis+ExtentReports实现对测试用例数据的读取,下面放出所有配置文件的目 ...

  5. ie浏览器多开-----同时登陆多个账号

    1.在电脑桌面右键 找到 新建快捷方式 在上图输入框中输入 "C:\Program Files\Internet Explorer\iexplore.exe" -noframeme ...

  6. vue+cordova插件使用,bluetoothSerial.connect()连接失败

    这是GitHub地址https://github.com/don/BluetoothSerial

  7. 爬虫高性能 asyncio库 twisted库 tornado库

    一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...

  8. Vue CLI 3+tinymce 5富文本编辑器整合

    基于Vue CLI 3脚手架搭建的项目整合tinymce 5富文本编辑器,vue cli 2版本及tinymce 4版本参考:https://blog.csdn.net/liub37/article/ ...

  9. 末学者笔记--Linux计划任务及压缩归档

    一.计划任务 1.介绍: (1)定义:简单说就是通过一些设置,来使linux系统定时执行一些操作与任务. (2)作用:一般可执行一些周期性操作,也可定期备份数据. (3)可使用的命令:常用为at和cr ...

  10. 为什么用Flow

    Flow 是 facebook 出品的 JavaScript 静态类型检查工具.Vue.js 的源码利用了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码. flow的工作方式? ...