BUAA-OO第二单元小结
一、设计策略
三次作业中,由于前两次作业都只有一部电梯,因此我的线程只有两个,一个等待队列输入进程,以及一个电梯运行进程。等待队列输入进程实现十分简单,只需要根据输入把request添加到等待队列即可。第一次作业电梯线程是傻瓜调度(FAFS)电梯,实现极为简单,只需从等待队列拿出一人,电梯将其带到指定楼层即可。第二次作业电梯线程为可捎带调度(ALS)电梯,程序实现开始复杂,在电梯接主请求的过程中,电梯每到一层楼会判断这层楼是否有等待的request,如果有就会捎带上。而第三次作业有三部电梯,并且每部电梯可停留的楼层、上下一层的时间都不一样,于是我写了三个电梯进程来实现作业的要求。
三次作业均采用synchronized关键字实现互斥访问共享数据(共享对象)来实现线程同步与通信的。访问共享对象(请求队列)为空,则令线程wait,在请求队列放入请求后,notify通知正处于wait的线程。
二、程序分析
1、第一次作业(FAFS电梯)
类图:

度量分析:


bug分析:由于第一次作业较为简单,因此bug较少,在自己写代码的过程中,主要遇到了整个进程无法结束的情况,主要由于自己没有考虑到结束进程的问题。之后发现了自己的bug之后,在等待队列增加request的线程以及电梯线程增加了结束判断,进程就可以结束了。
2、第二次作业(ALS电梯)
类图:

度量分析:


bug分析:这一次的bug主要是由于电梯进程CPU超时,主要是因为采取了while(){continue}的暴力轮询,将之改为wait()notify()结构,就可以避免。但是由于自己在开关门问题上没有考虑清楚,导致电梯在某个楼层同时有进人和出人情况时,门打开了两次。
3、第三次作业(SS电梯)
类图:

度量分析:


bug分析:这次作业bug较多,并且由于自己的理解不是很深刻,导致代码很爆炸。在中测时,又遇到了第一次作业进程无法停止问题,在强测时,是CPU超时并且实际运行时间超时。
三、心得体会
在这三次作业过程中,我对面向对象有了更深刻的了解,特别是对于多线程问题的学习,让我的见识更加深刻。但是我也遇到了很多问题,并且有些问题还是没有解决,希望通过之后的学习,能对与多线程的理解更加深刻。
BUAA-OO第二单元小结的更多相关文章
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- OO第二单元の小结
第二单元(线程与电梯问题)总结博客 三次作业的设计策略 第一次:本次作业只有一部电梯,而且不用捎带.因此,我一共设计了两个线程:一个负责管理输入,一个负责电梯运行.同时,我将调度队列设置为单例模式,里 ...
- 电梯模拟系统——BUAA OO第二单元作业总结
需求分析 官方需求 本次作业需要模拟一个多线程实时多电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 本次作业电梯系统具有的功能为:上下行, ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- 2020北航OO第二单元总结
2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...
- OO第二单元——多线程(电梯)
OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...
随机推荐
- Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究
2017-08-14 21:44:23 有很多中情况,分别展示. 1.Activity不做任何设置,布局使用LinearLayout 会自动滚动EditText之上的所有View,代码: <?x ...
- 用Tensorflow搭建神经网络的一般步骤
用Tensorflow搭建神经网络的一般步骤如下: ① 导入模块 ② 创建模型变量和占位符 ③ 建立模型 ④ 定义loss函数 ⑤ 定义优化器(optimizer), 使 loss 达到最小 ⑥ 引入 ...
- Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】
最近在做公司的项目的时候,开始把部分程序迁移到EF Core,然后有了一些感触,趁着还没忘却,还是先记录下来. EF Core还在成长中,我写这个的时候,版本是2.2.如果对着已有的EF 5/6来说, ...
- 使用eclipse整合ssh项目的例子--lljf(1)
最近向自己单独做一个基于ssh的项目,来预习和巩固自己的Java基础.找了一个实际生活中的定做衣服的例子来做一做,放到博客上给大家一起分享学习,后边会持续更新项目编写时候遇到的困难和使用的技术等. 1 ...
- sticky
最近有点忘了position几个取值的内容,在这里简单总结一下. position的含义是指定位类型,取值类型可以有:static.relative.absolute.fixed.inherit和st ...
- [转]MYSQL 创建存储过程
MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...
- 棋盘(noip2017普及组)
题目描述 有一个m \times mm×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色 ...
- vue生命周期和钩子函数
new Vue 创建vue实例 init events & liftcycle 开始初始化 beforeCreate 组件刚被创建,组件属性计算之前,如data属性等 init injecti ...
- Unix代码分析
世存最早的unix源代码:http://minnie.tuhs.org/cgi-bin/utree.pl?file=PDP7-Unix/sys 世存最早的cc:http://minnie.tuhs.o ...
- 设置Delphi默认按utf8格式保存单元文件
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\19.0\Editor] " ...