(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. python 的回调函数

    回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.有些库函数(library function)却 ...

  2. Beta 冲刺(2/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(2/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 做了点商家数据表格 接下来的计划 做 ...

  3. mysql官方测试库

    sql语句优化时没有测试数据,oracle官方提供测试数据 https://dev.mysql.com/doc/employee/en/employees-installation.html 到 ht ...

  4. 【原创】大叔问题定位分享(24)hbase standalone方式启动报错

    hbase 2.0.2 hbase standalone方式启动报错: 2019-01-17 15:49:08,730 ERROR [Thread-24] master.HMaster: Failed ...

  5. js在数组arr中随机获取count数量的元素

    // 在数组arr中随机获取count数量的元素; const getRandomArrayElements = (arr, num) => { // 新建一个数组,将传入的数组复制过来,用于运 ...

  6. P4147 玉蟾宫--单调栈

    P4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子 ...

  7. sublime 配置过程

    https://www.cnblogs.com/chengqi521/p/7600379.html

  8. 叩响C#之门-继承

    就记录下一些概念,以供备忘. 一生二,二生三,三生万物.类类相生,生生不息.   重写和重载的区别: 重载是指同一个类中相同名称但参数不同的方法. 重写是指继承关系中,在派生类中重写由基类继承来的方法 ...

  9. react组件生命周期

    1. Mounting/组建挂载相关 (1)componentWillMount 组件将要挂载.在render之前执行,但仅执行一次,即使多次重复渲染该组件或者改变了组件的state (2)compo ...

  10. 通过linux版本的lr agent提示找不到web_reg_save_param_ex函数

    Action.c(5): Error: C interpreter run time error: /tmp/brr_TSBgR2/netdir/E/lrscript/aaa/Action.c (5) ...