第一次作业:

由于第一次作业的调度较为简单,采用FIFO策略,以及不支持捎带功能,因此我的第一次电梯作业并没有设置单独的调度器,而会直接将任务交给电梯,电梯进行调度策略也仅为先运动到people的In层,让人上电梯,运动到OUT层,人下电梯。

除了Main类外共设置4个类。Inner类负责输入,Elevator类为电梯类,负责接收任务后将人运送。Task类储存Inner类读入的任务并将任务传入。由于线程之间耦合度不高,唯一的交接处仅为Tasks类中储存的ArrayList中的数据,将数据操作方法上锁后不会产生冲突。显然第一次作业类的耦合度不高,主要为了熟悉多线程程序的过程。

第二次作业和第一次作业的重要区别是加入了捎带功能,于是第一次作业时简单的将任务传输给电梯,电梯直接全程输送的方法失效。解决的方法为添加了调度器和时间周期的功能。

即电梯一次只会运动一层,运动一层过后确认是否需要开门和上下人。电梯实际上为一个有限状态机,根据一个信号量来决定电梯应该向上运动向下运动或静止。当people进行In后将任务交给电梯。当电梯中有任务时,自己决定运动方向,调度器仅能向电梯中加入可以捎带的人。当电梯中没有任务时,调度器将向电梯传递信号,决定电梯的移动方向。

和第一次相比,第二次作业仅加入了一个调度器类,即Scheduler类。负责根据Tasks类中的现有任务为电梯传递信号,即决定电梯的运动方向。

第三次电梯在第二次电梯作业的基础上有了三部不同的电梯。由于多部电梯的原因,需要多部电梯分工合作。我的方法为将电梯送到某一楼层后,将people送达该楼层后,将原任务删除并创建新任务。原本的PersonRequest类自己创建比较麻烦,因此自己创建了Person类来储存任务。捎带条件为当前距离任务最近的电梯无法直接将任务送达时,将会先将任务对应人送到尽可能远的楼层,使其他电梯可以将该人送到目的电梯。相比前几次的作业,主要进行了对调度器的调整。同时需要为三部电梯传递信号,决定将哪个任务传给哪部电梯更加合适。电梯类也需要略作改动。即因为电梯无法在每一层停靠,因此需要增加一些楼层不能开门。当无法直接送达时决定应当将任务送到哪一层使在该层电梯移动的距离最远。

OO第二次作业的更多相关文章

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

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

  2. OO第二次作业总结

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

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

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

  4. oo第二单元作业总结

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

  5. OO第二单元作业总结【自我反思与审视】

    第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...

  6. OO第二单元作业小结

    前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...

  7. OO第二单元作业分析

    前言 这一单元关于线程安全的作业结束了,在助教提供的接口的帮助以及老师提供的设计模型的指导下,这三次作业还是相对轻松地完成了,中间也没有出现什么bug,可能就是因为简单的逻辑不容易出错吧,可惜两次都由 ...

  8. 你电梯没了—OO第二单元作业思考

    写在前面 这三次电梯调度作业,主要是学习多线程并行操作,对于各个线程的时间轴的把握,互相的配合与影响,通过使用锁来解决访问冲突等方面. 个人在学会Thread相关操作之外,写出来一些奇怪结构的诡异操作 ...

  9. 北航OO第二单元作业总结(2.1~2.3)

    在经过第一单元初步认识面向对象编程思想后,本蒟蒻开始了第二单元--多线程部分的学习.本单元的作业是构造符合条件的"目的选层电梯"模型,自行设计调度算法,进行合理调度,完成所有乘客的 ...

随机推荐

  1. DOCTYPE的使用

    定义和用法 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> 声明不是 HTML 标签:它是指示 we ...

  2. 容器API

  3. scau 17967 大师姐唱K的固有结界 分类暴力 + RMQ

    由于能放两次,那么分类, 1.连续使用,(这个直接O(n^2)暴力) 2.分开使用. 分开使用的话,首先暴力枚举,用T时间,能从第1个位置,唱到第几首歌,然后剩下的就是从pos + 1, n这个位置, ...

  4. qconbeijing2018

    https://2018.qconbeijing.com/schedule 会议 · 第一天 (2018/04/20 周五) 时间 日程 上午 主题演讲 大数据下的软件质量建设实践 黄闻欣 出品 人工 ...

  5. PHP连接数据操作步骤

    数据库的操作步骤: 端口号:0到65535 3306:mysql数据库的默认端口号(可修改) mysql_connect(“本机地址”,“用户名”,“密码”,); new_link:如果用同样的参数第 ...

  6. c#内存管理,垃圾回收和资源释放

    <1>关于虚拟内存的概念 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上去,这些任务完全由windows后台管理,其实际结果是32位处理机上的每 ...

  7. ES6学习笔记(11)----Proxy

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Proxy1.概述    Proxy可以用来修改对象的默认操作    let obj = {na ...

  8. Java多态学习笔记

    面向对象三大特性:封装,继承和多态.其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼.经过仔细研究之后,终于搞懂了一点,特来做一个分享.独乐乐不如众乐乐. 何为多态?多态的本质是:一个程序中同名的 ...

  9. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)

    A(By talker): 题意分析:以a(int) op b(int)形式给出两个整数和操作符, 求两个整数是否存在操作符所给定的关系 ,有则输出true,无则输出false: 思路:由于无时间复杂 ...

  10. Java 游戏报错 看不懂求教

    Java 飞机小游戏 报错 看不懂求救 at java.awt.Component.dispatchEvent(Unknown Source)at java.awt.EventQueue.dispat ...