2019-oo-第二次总结
这一单元是关于模拟电梯运行,考验多线程的一个单元,难度由简入入深,从多线程单部电梯,到优化,再到多线程多部电梯,难度一次次的提高。
一.多线程单部电梯(傻瓜调度)
1.设计策略
这一次我只额外的开了一个线程,那就是电梯运行的线程,而通过单例模式创建了一个共享对象,在主线程中,输入数据,得到的数据push到共享对象里,而电梯的线程每运行到一层,判断共享对象中是否有可以上电梯的人。当然还有如何结束电梯,我是通过在电梯类设置了一个方法,当外面调用该类时就结束程序。
2.度量分析

图一.作业一类图
我是在Homework5中读入数据,并调用RequestQueue中push方法,push到共享队列,而此时的ElevatorResponse实时监测共享队列是否为空,若不为空,则调
用pull反法提取请求,电梯响应请求并运行,这次作业中我并未采取唤醒等待操作,而是直接暴力轮询。
3.自己bug分析
此次作业并未出现bug,感觉是因为这一次并未进行优化,所以大体框架也就比较简单,总共加上主线程也就两个线程。
4.互测方法
这一次不在像以前那样是多项式表达式的输入,这一次是依赖于时间的运行,在多线程中,如果采用暴力轮询,而不采用阻塞,就会导致当轮询一直运行下去,
过度占用CPU从而导致CPU运行时间过长而出现bug。其他的例如当访问某一共享对象并修改,不加锁也会出现问题。
二.多线程单部电梯(ALS方法)
1.设计策略
此次的情况与上一次作业比较,大抵是电梯运行情况不同,上一次是处理完一个请求再处理下一个,而这一次的情况则较为符合实际情况,在处理一个请求的同
时若在电梯运行的时候有其他人正好可以上电梯,则上电梯。但是这一次并为考虑电梯容量问题。所以我这一次作业就是在基于上一次作业基础上,只对电梯运行类进行修改。
2.度量分析

图二.作业二类图
我们可以看到图二与图一比较,只在电梯类有变化,之前的电梯类我只是简单的运行一个请求,再运行另一个,所以并没有写任何方法。而在这一次中我加了三
个方法,第一个执行电梯开门,第二个执行电梯关门,第三个执行电梯运行,而其中最重要的就是电梯运行这一个方法了,在这个方法中我调用了其他两个方法。也是执行ALS算法的关键。我在其中设置了一个判断,每到达一层就判断是否有请求满足情况上电梯,如果满足就从共享队列中pull。
3.自己bug分析
这次相对于上次,只要自己的电梯类没有出现逻辑问题,线程也不会出现问题。再加上这次的ALS比较简单,所以并没有出现bug。
4.互测方法
这一次不能设置超时bug,只能是多线程出现问题。而多线程,有可能线程并未结束,而程序结束了,也有可能暴力轮询出现问题。自己针对这两方面设置了样
例,但是自己却并没有找到bug。
三.多线程多部电梯(增加电梯限制)
1.策略分析
这一次对比上一次作业,增加了多部电梯,并加入了电梯限制。我的策略就是给每一个电梯分配一个请求队列,在RequestQueue中进行分发。而电梯的运行方式
还是和上一次的作业一样。只是取请求从其电梯对应的队列取。而其中有一个难点就是有的请求是需要两个电梯才能完成。所以我设置了一个未来队列,将需要两个电梯完成的请求分成两个请求,一个直接给分队列,另一个给未来队列,直到分队列中该请求完成,未来队列的请求才分配给分队列。其中判断的关键在与每个人的id是不重复的。而这一次的调度器也不再仅仅简单的是一个共享对象,而也是一个线程。
2.度量分析

图三.作业三类图
在和图二对比,我们可以看到,变换的在RequestQueue类里加了queueadd方法,其实,我在该类里一共new了4个共享队列,一个主队列,三个对应于电梯的分
队列,而queueadd方法就是将主队列的队列分配到三个分队列。也是这一次修改最多的地方。
3.自己bug分析
这一次电梯加了容量的限制,所以我在电梯类中的elevatorIn中加了是否满容量,却忽略了在elevatorRun中自己也有开门进人的操作,并没有判断。导致出现了
bug。
4.互测方法
这一次互测就有许多方面可以测试了,特别是电梯的限制是否满足(自己也出现了这种情况),还有就是当一个请求需要两部电梯完成时,是否能够成功完成。
当然还有就是线程问题。这一次较于上次的作业,多了一个调度器线程,如果不好好分析,对共享对象加锁。会很容易出现问题的。
四.总结
1.线程安全
首先遇到的暴力轮询出现的CPU过时的问题,该问题就促使我们寻找另一种好的方法来解决,就是唤醒与等待,当一个线程没有请求时就阻塞,直到有该线程才唤醒
。然后就是共同访问的问题了,由于后面有三个电梯,在对队列进行访问,并删除或增加,所以需要加锁。还有就是程序结束时需要结束所有线程,不然会导致超时。
2.设计原则
我认为设计最重要的就是每个部分做自己应该的事,互相交叉较少。互不干扰设计一个共享对象,电梯进行pull,而输入进行push,互不影响。独立出来调度器来分配
梯所做的就只有根据调度器所分配的请求进行运行。
2019-oo-第二次总结的更多相关文章
- OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二次作业总结
OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- OO第二次单元总结
OO第二次单元总结 前言 第二单元的三次作业:系列电梯与多线程. 第五次作业 (1)设计策略 电梯的第一次作业是单部傻瓜电梯,采用FAFS调度策略,电梯按队列顺序依次处理请求,单次只处理一个请求.本次 ...
- “全栈2019”Java第二章:安装JDK11(Windows)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 文章原文链接 "全栈2019"Java第二章:安装JDK11(Windows) 下一 ...
随机推荐
- 配置maven项目的开发时的默认jdk版本
配置所有maven项目的默认jdk版本,若不配置则提示"Warning:java: 源值1.5已过时, 将在未来所有发行版中删除" 在settings.xml文件中profiles ...
- Monolog手册参考
https://api.kdyby.org/namespace-Monolog.Handler.html
- vitualbox中的centos7与主机共享文件
我在vitualbox中安装了一个centos7,最小安装.主机是win10操作系统.那么如何在虚拟机和主机之间进行文件共享呢,下面是本人实现过程,以及过程中遇到的一些问题. 1.在主机中选择一个文件 ...
- tar 压缩归档
压缩归档 掌握归档的定义:归档(archiving)就是将许多文件(或目录)打包成一个文件. 了解归档的目的:归档的目的就是方便备份.还原及文件的传输操作. 掌握tar命令的功能:将多个文件(也可能包 ...
- Django——RESTful架构
一.REST简述 来自维基百科的解释: 表现层状态转换(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博 ...
- 04_ switch 练习 _ 你及格了吗
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- AUC计算 - 进阶操作
首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前 ...
- springBoot使用@Value标签读取*.properties文件的中文乱码问题
上次我碰到获取properties文件中的中文出现乱码问题. 查了下资料,原来properties默认的字符编码格式为asci码,所以我们要对字符编码进行转换成UTF-8格式 原先代码:@Proper ...
- JPA(Hibernate)
JPA 1,JPA:Java Persistence API.JPA通过JDK 5.0注解-关系表的映射关系,并将运行期的实体对象持久化到数据库中.JPA是JavaEE中的标准.JPA标准只提供了一套 ...
- 壁虎书1 The Machine Learning Landscape
属性与特征: attribute: e.g., 'Mileage' feature: an attribute plus its value, e.g., 'Mileage = 15000' Note ...