OO第二次作业
第一次作业:
由于第一次作业的调度较为简单,采用FIFO策略,以及不支持捎带功能,因此我的第一次电梯作业并没有设置单独的调度器,而会直接将任务交给电梯,电梯进行调度策略也仅为先运动到people的In层,让人上电梯,运动到OUT层,人下电梯。
除了Main类外共设置4个类。Inner类负责输入,Elevator类为电梯类,负责接收任务后将人运送。Task类储存Inner类读入的任务并将任务传入。由于线程之间耦合度不高,唯一的交接处仅为Tasks类中储存的ArrayList中的数据,将数据操作方法上锁后不会产生冲突。显然第一次作业类的耦合度不高,主要为了熟悉多线程程序的过程。
第二次作业和第一次作业的重要区别是加入了捎带功能,于是第一次作业时简单的将任务传输给电梯,电梯直接全程输送的方法失效。解决的方法为添加了调度器和时间周期的功能。
即电梯一次只会运动一层,运动一层过后确认是否需要开门和上下人。电梯实际上为一个有限状态机,根据一个信号量来决定电梯应该向上运动向下运动或静止。当people进行In后将任务交给电梯。当电梯中有任务时,自己决定运动方向,调度器仅能向电梯中加入可以捎带的人。当电梯中没有任务时,调度器将向电梯传递信号,决定电梯的移动方向。
和第一次相比,第二次作业仅加入了一个调度器类,即Scheduler类。负责根据Tasks类中的现有任务为电梯传递信号,即决定电梯的运动方向。
第三次电梯在第二次电梯作业的基础上有了三部不同的电梯。由于多部电梯的原因,需要多部电梯分工合作。我的方法为将电梯送到某一楼层后,将people送达该楼层后,将原任务删除并创建新任务。原本的PersonRequest类自己创建比较麻烦,因此自己创建了Person类来储存任务。捎带条件为当前距离任务最近的电梯无法直接将任务送达时,将会先将任务对应人送到尽可能远的楼层,使其他电梯可以将该人送到目的电梯。相比前几次的作业,主要进行了对调度器的调整。同时需要为三部电梯传递信号,决定将哪个任务传给哪部电梯更加合适。电梯类也需要略作改动。即因为电梯无法在每一层停靠,因此需要增加一些楼层不能开门。当无法直接送达时决定应当将任务送到哪一层使在该层电梯移动的距离最远。
最新文章
- 火狐下多个span连在一起和换行写存在差异
- Filezilla 适用于 Win2003 和 WinXP 的版本
- 好用的內存鏡像工具Belkasoft RAM Capture
- Codrops 优秀教程:CSS 3D Transforms 实现书本效果
- FCM算法
- Mybatis 实用
- 实例讲解Oracle数据库设置默认表空间问题
- android 27 ListView
- Oracle sql语句创建表空间、数据库、用户及授权
- 如何用PC标签在列表页中调出文章内容 phpcms
- MySql分库分表总结(转)
- 201521123079《java程序设计》第8周学习总结
- web前端开发 --好多视频大集合--文化的传播者-杜恩德
- Linux环境搭建 | 手把手教你如何安装CentOS7虚拟机
- 【转】Chrome 控制台新玩法-console显示图片以及为文字加样式
- SQL Server性能优化(12)非聚集索引的组合索引存储结构
- php特别值
- SpringMVC在使用Jackson2时关于日期类型格式化的问题
- MySQL 如何删除有外键约束的表数据
- BeautifulSoup的成员结构