OO第二次单元总结

前言

第二单元的三次作业:系列电梯与多线程。

第五次作业

(1)设计策略

电梯的第一次作业是单部傻瓜电梯,采用FAFS调度策略,电梯按队列顺序依次处理请求,单次只处理一个请求。本次作业采用了简单的生产者-消费者模式,而调度器则采用了单例模式。

(2)基于度量来分析自己的程序结构

类图:

复杂度分析:

依赖度分析:

本次作业很简单,共设计了四个类,除主线程外包含一个请求输入线程和一个电梯线程。Scheduler类为单例模式调度器,内部有一个请求队列。Input类负责请求的获取和存入,每当获取到一个有效请求时,调用调度器中add方法存入队列。Elevator类为电梯类,调用调度器中getArray方法获取请求并执行。类各有分工,便于拓展下一次作业。

(3)分析自己程序的bug

由于本次作业调度方法很简单,线程交互也不复杂,所以在公测和互测中并没有发现bug。但在写的过程中遇到的最大问题是无法关闭电梯线程,后得到解决。

(4)分析自己发现别人程序bug所采用的策略

由于设计简单,大部分人代码量很小,所以主要采用了阅读代码的方式寻找别人的bug。

第六次作业

(1)设计策略

电梯的第二次作业为单部可捎带电梯,采用ALS调度策略。和上一次作业相比,只是增加了负楼层以及改变了调度策略,因此设计模式完全继承于上一次作业,做出了部分改变。

(2)基于度量来分析自己的程序结构

类图:

复杂度分析:

依赖度分析:

本次作业也是四个类,除主线程外两个线程。Scheduler类调度器负责存储和分配请求。Input类负责请求的获取和存入。这次,在Elevator类中增加了一个请求队列,用于存储主请求及其可捎带请求,电梯每到一层与请求队列进行交互,从而判断乘客的进出。由于设计缺陷,Elevator.run方法过长,从由图中可以看出,其复杂度很高。

(3)分析自己程序的bug

由于最后时间紧迫,这次作业在写完进行很简单测试后便提交了,通过了中测。但在强测中,发现了致命bug而未进入互测。bug不涉及线程安全,而是调度算法的缺陷,当电梯到达某一楼层时,我采取先下后上,当全部下去后(队列为空),我需要从队列取出主请求,来判断是否可以上,这时便会报错error。当我改成先上后下,问题就不存在了。之后应该合理安排时间,多编写测试样例,避免低级错误。

第七次作业

(1)设计策略

电梯的第三次作业为多部多线程智能(SS)电梯。单部电梯的调度策略上,我仍采用了上一次作业的可捎带(ALS)调度。和上一次作业相比,由一部电梯变为三部电梯,而且这三部电梯的可停靠楼层、运行时间、最大载客量都不相同。最大的限制在于可停靠楼层不同,因此乘客可能需要在中间换乘才能到达目的地。最后,我采用了最简单直接的方法,将请求固定地拆分成两个请求,然后存入队列,等待执行。因此,本次作业设计模式基本继承于第二次作业,并做出了部分改变。

(2)基于度量来分析自己的程序结构

类图:

复杂度分析:

依赖度分析:

本次作业共五个类,除主线程外一个输入线程,三个电梯线程。这次新增加了一个Request类,用于将PersonRequest拆分后封装新的请求,有五个属性,增加了id和request,分别用于存放执行电梯号和换乘前请求。其它类的功能和上一次作业一样。Elevator.run方法继承于上一次的代码,由于时间不够,过长的问题没有解决。由于调度器的调度方法采用硬编码的形式,由一系列if-else组成,因此很明显,Scheduler.add方法复杂度很高,几乎无法拓展。

(3)分析自己程序的bug

性能较差,但在公测和互测中并没有发现bug。

(4)分析自己发现别人程序bug所采用的策略

在互测中仍主要依靠阅读代码来发现bug,但效果很不好。

总结

这一单元三次电梯作业让我们对多线程有了由浅入深的了解。但抛去暴力轮询的方法,我对wait和notifyall的使用还不够熟练,总会出现很多问题,在之后的学习中会多加练习,争取掌握。此外,在代码设计上仍有很大的不足,缺乏明确的设计而导致部分方法过长,先写后修难度很大,复杂度也很高,之后的作业中,要尽量在写之前设计分配好各方法,对代码风格和debug都有帮助。下一单元,继续努力!

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

  1. OO第二次单元总结——电梯多线程调度问题

    OO第二次单元总结--电梯多线程调度问题 在这个单元OO学习中,我们终于迎来了期待已久(不是)的电梯多线程调度作业,开启了OO打怪之路的新关卡.虽然说经过了这三次作业,我对于多线程的理解还不能算是熟练 ...

  2. oo第二单元作业总结

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

  3. OO第二单元优化博客

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

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

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

  5. OO第二单元(电梯)单元总结

    OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...

  6. OO第二单元小结

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

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

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

  8. 电梯也能无为而治——oo第二单元作业总结

    oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...

  9. 2020北航OO第二单元总结

    2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...

随机推荐

  1. cygwin下使用apt-cyg安装新软件

    1.获取  (记得先安装好git) git clone https://github.com/transcode-open/apt-cyg.git 2.安装apt-cyg cd apt-cyg chm ...

  2. 日志统计|2018年蓝桥杯B组题解析第八题-fishers

    标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞" ...

  3. Unity3D学习笔记(十六):Animator新动画

    新动画系统: 给模型选择动画类型 普通动画:Generic 人形动画:Humanoid 建立动画控制器 - 在Project右击 - 选择Create-AnimatorContorller 将对应动画 ...

  4. 读jQuery源码有感

    读之前的预备工作: 1.基础的js知识,以及html和css知识,和正则表达式知识.可以参考妙味课堂的基础js,html和css大纲. 2.JavaScript核心指南的知识http://www.cn ...

  5. Python day4_list的常见方法1_笔记(浅拷贝和深拷贝的简述)

    li=[1,2,3,'55dd'] li.clear()#清除列表内容 print(li) li.append(1)#追加 li.append(3) print(li) #拓展:直接赋值和copy和d ...

  6. RabbitMQ入门_13_消息持久化

    参考资料:https://www.rabbitmq.com/tutorials/tutorial-two-java.html 默认情况下,队列中的消息是不持久化的.如果 RabbitMQ 崩溃,队列中 ...

  7. 【转】cs231n学习笔记-CNN-目标检测、定位、分割

    原文链接:http://blog.csdn.net/myarrow/article/details/51878004 1. 基本概念 1)CNN:Convolutional Neural Networ ...

  8. Jedis 之 初始<一>

    package xx.jedis; import java.util.Set; import redis.clients.jedis.Jedis; import redis.clients.jedis ...

  9. Codeforces 735B - Urbanization

    735B - Urbanization 思路:贪心.人数少的城市住钱最多的那几个人. 不证明了,举个例子吧:a1<a2<a3<a4<a5 (a1+a2+a3)/3+(a4+a5 ...

  10. Codeforces 388A - Fox and Box Accumulation

    388A - Fox and Box Accumulation 思路: 从小到大贪心模拟. 代码: #include<bits/stdc++.h> using namespace std; ...