这一单元是关于模拟电梯运行,考验多线程的一个单元,难度由简入入深,从多线程单部电梯,到优化,再到多线程多部电梯,难度一次次的提高。


一.多线程单部电梯(傻瓜调度)


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-第二次总结的更多相关文章

  1. OO第二次博客作业——电梯调度

    OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...

  2. oo第二单元作业总结

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

  3. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  4. OO第二次博客作业—17373247

    OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...

  5. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  6. OO第二次作业总结

    OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...

  7. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

  8. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

  9. OO第二次单元总结

    OO第二次单元总结 前言 第二单元的三次作业:系列电梯与多线程. 第五次作业 (1)设计策略 电梯的第一次作业是单部傻瓜电梯,采用FAFS调度策略,电梯按队列顺序依次处理请求,单次只处理一个请求.本次 ...

  10. “全栈2019”Java第二章:安装JDK11(Windows)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 文章原文链接 "全栈2019"Java第二章:安装JDK11(Windows) 下一 ...

随机推荐

  1. OpenCV imread读取jpg图像的一个大坑

    长话短说 版本区间[OpenCV3.0.0, OpenCV3.4.1]内的OpenCV,(至少在windows下,使用官方提供的预编译版本),imread读取jpg图片后的像素值,和版本区间[Open ...

  2. RxPermissions Usage

    refs:https://github.com/tbruyelle/RxPermissions https://www.jianshu.com/p/c3546e5cd2ffhttps://www.ji ...

  3. php扩展打开不起作用的原因, php数字显示2147483647的原因

    因为公司订单id类型是bigint, 而PHP32位最大整数是2147483647 . 所以需要重新下载PHP64位. laravel总是报错 Call to undefined function I ...

  4. 安装elasticsearch-7.0.0(centos)

    云主机上需设置root密码 sudo passwd root 回车后出入密码两次 jdk11页面 https://www.oracle.com/technetwork/java/javase/down ...

  5. 利用NSE脚本检测域传送和证书透明度滥用

    nslookup -type=NS <domain> <server> nmap -p 53 --script dns-zone-transfer --script-args ...

  6. 数据挖掘算法——Apriori算法

    Apriori算法  首先,Apriori算法是关联规则挖掘中很基础也很经典的一个算法. 转载来自:链接:https://www.jianshu.com/p/26d61b83492e 所以做如下补充: ...

  7. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)

    LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...

  8. mobile_1 物理像素

    1 物理像素 需求: border: 1px solid red; 在移动端 dpr 为 2 的屏幕上,实际上是 2 物理像素.    如何实现 1 物理像素? 首先,肯定不能 border: 0.5 ...

  9. Codeforces Round #524 (Div. 2)

    A. Petya and Origamitime limit per test1 secondmemory limit per test256 megabytesinputstandard input ...

  10. 查看webdriver API

    pydoc是Python自带的模块,主要用于从python模块中自动生成文档 生成web页面文档: cmd->python -m pydoc -p 8888 -p:在本机上启动服务 8888:端 ...