一、设计策略

三次作业中,由于前两次作业都只有一部电梯,因此我的线程只有两个,一个等待队列输入进程,以及一个电梯运行进程。等待队列输入进程实现十分简单,只需要根据输入把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第二单元小结的更多相关文章

  1. OO第二单元小结

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

  2. OO第二单元の小结

    第二单元(线程与电梯问题)总结博客 三次作业的设计策略 第一次:本次作业只有一部电梯,而且不用捎带.因此,我一共设计了两个线程:一个负责管理输入,一个负责电梯运行.同时,我将调度队列设置为单例模式,里 ...

  3. 电梯模拟系统——BUAA OO第二单元作业总结

    需求分析 官方需求 本次作业需要模拟一个多线程实时多电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 本次作业电梯系统具有的功能为:上下行, ...

  4. oo第二单元作业总结

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

  5. OO第二单元优化博客

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

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

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

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

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

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

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

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

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

  10. OO第二单元——多线程(电梯)

    OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...

随机推荐

  1. css自定义滚动条

    有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了.那webkit浏览器是如何自定义滚动条的呢? 前言 ...

  2. 使用Spark进行搜狗日志分析实例——列出搜索不同关键词超过10个的用户及其搜索的关键词

    package sogolog import org.apache.hadoop.io.{LongWritable, Text} import org.apache.hadoop.mapred.Tex ...

  3. JAVA面向对象之重载与重写

    重写:子类对父类方法的重新编写 返回值不变,形参不变 不能抛出新的或者范围更广的异常 class Animal{ public void move(){ System.out.println(&quo ...

  4. re模块基本用法和字符集

    import re # . 能够替代任意字符 r= re.findall("a..c","abbcsd") print(r) # ^ 找最前面的 r_1 = r ...

  5. 网站内容js设置 禁止复制,禁止选择

    网站内容禁止复制和粘贴.另存为的js代码 1.使右键和复制失效 方法1: 在网页中加入以下代码:  复制代码代码如下: <script language="Javascript&quo ...

  6. html 使表格随着内容自动适应宽度

    所谓难而不会,会儿不难.这个问题让我纠结了很长时间,一句css解决了,仅仅靠一个属性 td { white-space: nowrap; } from:http://blog.csdn.net/liu ...

  7. Docker 学习新手笔记:从入门到放弃

    本文记录的是作为一个新手,从了解 Docker 是什么.Docker 技术包含哪些概念到上手使用.安装以及发布 Docker 镜像的整个过程.作者在学习过程中参阅了诸多文档和教程,在此一并感谢,与此同 ...

  8. Linux三个网络监视器之《二》——nethogs

    当你想要快速了解谁占用了你的带宽时,Nethogs 是快速和容易的.以 root 身份运行,并指定要监听的接口.它显示了空闲的应用程序和进程号,以便如果你愿意的话,你可以杀死它. 1 1.在这个网址f ...

  9. 今天写代码遇到了一个BUG

    在我们日常写注释是需要注意,在有返回值的里面不要用以下方式注释,不然不会报错,运行状态码返回也是200,但就不是想要的结果. 下面举个例子 return { 'token':token, 'user_ ...

  10. webpos登录不上

    jo=new JSONObject(((java.sql.Clob)s).getSubString(1, (int) ((java.sql.Clob)s).length()));