热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BUAA_2022_OO_第二单元总结

2022_OO_Unit2本单元作业为电梯调度,作业背景为存在A、B、C、D、E五栋楼,每栋楼10层。乘客乘坐电梯时需要告知其目的地。作业1:每栋楼各一个电梯,可达1-10层,速率

2022_OO_Unit2

本单元作业为电梯调度,作业背景为存在A、B、C、D、E五栋楼,每栋楼10层。乘客乘坐电梯时需要告知其目的地。

作业1:每栋楼各一个电梯,可达1-10层,速率等均一定。保证乘客不会目的地不跨楼。

作业2:保持每栋楼各一个电梯,同时增加横向电梯。乘客请求满足(出发楼座 == 目的楼座)+ (出发楼层 == 目的楼层) = 1。通俗讲乘客请求一定是横向或纵向的。可动态增加电梯,电梯无可达性限制。保证横向请求出现前该层必存在横向电梯。

作业3:乘客请求更改为(出发楼座 == 目的楼座)+ (出发楼层 == 目的楼层) > 0,即可能存在既跨楼层又跨楼座的情况。


一、第一次作业


1 作业整体思路

​ 本次作业只包含五个互不干扰的电梯,开发相对简单,使用生产者消费者模式协调即可。


2 架构设计


2.1 UML图

classDiagram
class Thread
class Input{
-WaitQueue waitQueue
+run()
}
class WaitQueue{
-HashMap passengers
-boolean isFalse
+addPassenger(Passenger)
+getPassenger(char) ArrayList
+setEnd(boolean)
+isNull() boolean
+needEnd() boolean
+needWait()
}
class Scheduler {
-WaitQueue allWaitQueue
-HashMap buildingWaitQueues
+run()
+putRequest()
+end()
}
class BuildingWaitQueue {
-boolean isEnd
-char building
-HashMap passengers
+addPassenger(Passenger)
+addPassengers(ArrayList)
+setEnd()
+getNearRequest(int, int) ArrayList
+hasTakeByPassenger(int, int, int) boolean
+getNearFloor(int) int
+hasPassenger(int, int) boolean
+needChangeDir(int, int) boolean
+getPassenger(int, int, int) ArrayList
+needEnd() boolean
}
class Elevator {
-char building
-int id
-int openTime
-int closeTime
-int moveTime
-BuildingWaitQueue
-int size
-int nowFloor
-int dir
-ArrayList inElevatorPassenger
+run()
+look()
+move(int)
+open()
+getOff()
+getIn()
+close()
+hasArrivedPassenger() boolean
}
class Passenger{
-PersonRequest personRequest
-int dir
+getId() int
+getFromFloor() int
+getToFloor() int
+getFromBuilding() char
+getToBuilding() char
}
Thread <|-- Input
Thread <|-- Scheduler
Thread <|-- Elevator
WaitQueue <-- Input
Scheduler <-- WaitQueue
BuildingWaitQueue <-- Scheduler
Elevator <-- BuildingWaitQueue
Passenger <.. WaitQueue
Passenger <.. BuildingWaitQueue
2.2 类设计目的

​ 使用了生产者消费者模式,Input线程作为生产者向WaitQueue托盘添加请求,Scheduler线程取走WaitQueue托盘请求,同时向BuildingWaitQueue中添加请求。Elevator线程作为消费者负责读取BuildingWaitQueue处理请求。


2.3 线程安全控制

​ 将托盘的读写方法加锁,避免出现冲突、死锁。

​ 线程结束时层层设置Tag,处理完请求且Tag为True时即可结束。


2.4 电梯运行策略

​ 使用了Look策略,即电梯内无乘客且当前方向上无请求时反向。


3. 程序结构分析


3.1 各类代码量










































































































FileTotal LinesSource Code LinesSource Code Lines[%]Comment Code LinesComment Code Lindes [%]Blank LinesBlank Lines[%]
BuildingElevator.java1931810.937823834196891200.0120.06217616580310881
BuildingWaitQueue.java1751600.914285714285714300.0150.08571428571428572
FloorWaitQueue.java1351250.925925925925925900.0100.07407407407407407
Input.java43360.837209302325581400.070.16279069767441862
Main.java36260.722222222222222240.111111111111111160.16666666666666666
Output.java860.7500.020.25
Passenger.java72610.847222222222222200.0110.1527777777777778
Scheduler.java56510.910714285714285700.050.08928571428571429
WaitQueue.java64540.8437500.0100.15625

3.2 方法复杂度

















































































































































































































































































































































































































































MethodCogCev(G)iv(G)v(G)
BuildingElevator.BuildingElevator(char, int, int, int, int, int, BuildingWaitQueue, ...)0111
BuildingElevator.beforeHandleTarget()1711113
BuildingElevator.close()0111
BuildingElevator.getIn()5144
BuildingElevator.getInMainRequest()3323
BuildingElevator.getOff()4144
BuildingElevator.hasArrivedPassenger()3323
BuildingElevator.look()1931014
BuildingElevator.move(int)0111
BuildingElevator.open()0111
BuildingElevator.run()10389
BuildingWaitQueue.BuildingWaitQueue(char)1122
BuildingWaitQueue.addPassenger(Passenger)1122
BuildingWaitQueue.addPassengers(ArrayList

)

4144
BuildingWaitQueue.getNearFloor(int)132810
BuildingWaitQueue.getNearRequest(int, int)1212
BuildingWaitQueue.getPassenger(int, int, int)236913
BuildingWaitQueue.hasPassenger(int, int)5335
BuildingWaitQueue.hasTakeByPassenger(int, int)5335
BuildingWaitQueue.isEnd()0111
BuildingWaitQueue.isNull()1122
BuildingWaitQueue.needChangeDir(int, int)9537
BuildingWaitQueue.needEnd()1122
BuildingWaitQueue.setEnd()0111
Elevator.Elevator(char, int, int, int, int, BuildingWaitQueue, int)0111
Elevator.close()0111
Elevator.getIn()5134
Elevator.getOff()4144
Elevator.hasArrivedPassenger()3323
Elevator.look()163911
Elevator.move(int)0111
Elevator.open()0111
Elevator.run()10367
Elevator.setDir(int)0111
Input.Input(WaitQueue, HashMap, HashMap)0111
Input.run()11366
Main.main(String[])3144
Output.println(String)0111
Passenger.Passenger(PersonRequest)10117
Passenger.canTake()0111
Passenger.getFromBuilding()0111
Passenger.getFromFloor()0111
Passenger.getHorizontalDir()0111
Passenger.getId()0111
Passenger.getToBuilding()0111
Passenger.getToFloor()0111
Passenger.getVerticalDir()0111
Passenger.toString()0111
Scheduler.Scheduler(WaitQueue, HashMap, HashMap)0111
Scheduler.end()2133
Scheduler.putRequest()7144
Scheduler.run()8355
WaitQueue.WaitQueue()0111
WaitQueue.addPassenger(PersonRequest)0111
WaitQueue.getPassenger(char)0111
WaitQueue.isEnd()0111
WaitQueue.isNull()1122
WaitQueue.needEnd()2223
WaitQueue.needWait()3133
WaitQueue.setEnd()0111

4. 正确性、性能、架构分析


4.1 正确性

​ 没有考虑到输出存在的线程不安全问题,在强测中没有出现问题,但在互测中被hack


4.2 性能

​ look算法在强测中取得了相对较高的成绩,个人认为是值得采用的。


4.3架构

​ 后续开发体验中感觉调度器没有必要设为线程,反而徒增复杂度,本人也在第三次去掉了调度器祭天,法力无边


二、第二次作业


1 作业整体思路

​ 本次增加了横向电梯,但对乘客请求加了较强的限制条件,故处理思路与纵向电梯相同。对于多部电梯,采用的是自由竞争的方式。


2 架构设计


2.1 UML图

classDiagram
class Thread
class Input{
-WaitQueue waitQueue
+run()
}
class WaitQueue{
-HashMap passengers
-boolean isFalse
+addPassenger(Passenger)
+getPassenger(char) ArrayList
+setEnd(boolean)
+isNull() boolean
+needEnd() boolean
+needWait()
}
class Scheduler {
-WaitQueue allWaitQueue
-HashMap buildingWaitQueues
-HashMap florrWaitQueues
+run()
+putRequest()
+end()
}
class BuildingWaitQueue {
-boolean isEnd
-char building
-HashMap passengers
+addPassenger(Passenger)
+addPassengers(ArrayList)
+setEnd()
+getNearRequest(int, int) ArrayList
+hasTakeByPassenger(int, int, int) boolean
+getNearFloor(int) int
+hasPassenger(int, int) boolean
+needChangeDir(int, int) boolean
+getPassenger(int, int, int) ArrayList
+needEnd() boolean
}
class FloorWaitQueue {
-boolean isEnd
-char building
-HashMap passengers
+addPassenger(Passenger)
+addPassengers(ArrayList)
+setEnd()
+getNearRequest(int, int) ArrayList
+hasTakeByPassenger(int, int, int) boolean
+getNearFloor(int) int
+hasPassenger(int, int) boolean
+needChangeDir(int, int) boolean
+getPassenger(int, int, int) ArrayList
+needEnd() boolean
}
class BuildingElevator {
-char building
-int id
-int openTime
-int closeTime
-int moveTime
-BuildingWaitQueue
-int size
-int nowFloor
-int dir
-ArrayList inElevatorPassenger
+run()
+look()
+move(int)
+open()
+getOff()
+getIn()
+close()
+hasArrivedPassenger() boolean
}
class FloorElevator {
-char building
-int id
-int openTime
-int closeTime
-int moveTime
-BuildingWaitQueue
-int size
-int nowFloor
-int dir
-ArrayList inElevatorPassenger
+run()
+strategy()
+move(int)
+open()
+getOff()
+getIn()
+close()
+hasArrivedPassenger() boolean
}
class Passenger{
-PersonRequest personRequest
-int hordir
-int verdir
+getId() int
+getFromFloor() int
+getToFloor() int
+getFromBuilding() char
+getToBuilding() char
+gethordir() int
+getverdir() int
}
Thread <|-- Input
Thread <|-- Scheduler
Thread <|-- BuildingElevator
Thread <|-- FloorElevator
WaitQueue <-- Input
Scheduler <-- WaitQueue
BuildingWaitQueue <-- Scheduler
FloorWaitQueue <-- Scheduler
BuildingElevator <-- BuildingWaitQueue
FloorElevator <-- FloorWaitQueue
Passenger <.. WaitQueue
Passenger <.. BuildingWaitQueue
Passenger <.. FloorWaitQueue
2.2 类设计目的

​ 看属性不难发现,其实相当于copy了一份原elevator,本意是打算使用继承关系的,但是考虑到横向电梯与纵向电梯还是存在较大差别,最终没有选择。


2.3 电梯运行策略

​ 纵向电梯保持不变,横向电梯因为是环状的所以跨两座楼以上的乘客不论最近方向均可捎带。


3. 程序结构分析


3.1 各类代码量




















































































































FileTotal LinesSource Code LinesSource Code Lines[%]Comment Code LinesComment Code Lindes [%]Blank LinesBlank Lines[%]
BuildingElevator.java1761630.926136363636363600.0130.07386363636363637
BuildingWaitQueue.java1401290.921428571428571400.0110.07857142857142857
FloorElevator.java1771640.926553672316384200.0130.07344632768361582
FloorWaitQueue.java1351250.925925925925925900.0100.07407407407407407
Input.java60530.883333333333333300.070.11666666666666667
Main.java29240.827586206896551700.050.1724137931034483
Output.java860.7500.020.25
Passenger.java72610.847222222222222200.0110.1527777777777778
Scheduler.java42350.833333333333333400.070.16666666666666666
WaitQueue.java64540.8437500.0100.15625

3.2 方法复杂度























































































































































































































































































































































































































































































































MethodCogCev(G)iv(G)v(G)
BuildingElevator.BuildingElevator(char, int, int, int, int, int, BuildingWaitQueue, ...)0111
BuildingElevator.close()0111
BuildingElevator.compete()7177
BuildingElevator.getCpuTime()1122
BuildingElevator.getIn()5144
BuildingElevator.getInFirst(ArrayList

)

2133
BuildingElevator.getOff()4144
BuildingElevator.hasArrivedPassenger()3323
BuildingElevator.look()173810
BuildingElevator.move(int)0111
BuildingElevator.open()0111
BuildingElevator.run()10367
BuildingWaitQueue.BuildingWaitQueue(char)1122
BuildingWaitQueue.addPassenger(Passenger)1122
BuildingWaitQueue.getNearFloor(int)132810
BuildingWaitQueue.getPassenger(int, int, int)236913
BuildingWaitQueue.hasPassenger(int, int)5335
BuildingWaitQueue.isEnd()0111
BuildingWaitQueue.isNull()1122
BuildingWaitQueue.needChangeDir(int, int)9537
BuildingWaitQueue.needEnd()1122
BuildingWaitQueue.setEnd()0111
FloorElevator.FloorElevator(char, int, int, int, int, int, FloorWaitQueue, ...)0111
FloorElevator.close()0111
FloorElevator.compete()7177
FloorElevator.getDir(int, int)2213
FloorElevator.getIn()6155
FloorElevator.getInFirst(ArrayList

)

3144
FloorElevator.getOff()4144
FloorElevator.hasArrivedPassenger()3323
FloorElevator.move(int)2113
FloorElevator.open()0111
FloorElevator.run()10367
FloorElevator.strategy()14379
FloorWaitQueue.FloorWaitQueue(int)1122
FloorWaitQueue.addPassenger(Passenger)1122
FloorWaitQueue.getNearBuilding(char)132810
FloorWaitQueue.getPassenger(int, char, int)2461014
FloorWaitQueue.hasPassenger(int, char)4334
FloorWaitQueue.isNull()1122
FloorWaitQueue.needChangeDir(int)12647
FloorWaitQueue.needEnd()1122
FloorWaitQueue.setEnd()0111
Input.Input(HashMap, HashMap)0111
Input.run()16399
Main.main(String[])3144
Output.println(String)0111
Passenger.Passenger(PersonRequest)10117
Passenger.canTake()0111
Passenger.getFromBuilding()0111
Passenger.getFromFloor()0111
Passenger.getHorizontalDir()0111
Passenger.getId()0111
Passenger.getToBuilding()0111
Passenger.getToFloor()0111
Passenger.getVerticalDir()0111
Passenger.toString()0111
Scheduler.Scheduler()0111
Scheduler.gerInstance()0111
Scheduler.initial(HashMap, HashMap)0111
Scheduler.putRequest(Passenger)2122
Scheduler.setEnd()2133
WaitQueue.WaitQueue()0111
WaitQueue.addPassenger(PersonRequest)0111
WaitQueue.getPassenger(char)0111
WaitQueue.isEnd()0111
WaitQueue.isNull()1122
WaitQueue.needEnd()2223
WaitQueue.needWait()3133
WaitQueue.setEnd()0111

三、第三次作业


1 作业整体思路

​ 本次乘客的目的地将可能不存在直达电梯,需要换乘,实现时借鉴了上机实验的流水线模式。


2 架构设计


2.1 UML图

classDiagram
class Thread
class Input{
-WaitQueue waitQueue
+run()
}
class Scheduler {
-WaitQueue allWaitQueue
-HashMap buildingWaitQueues
-HashMap florrWaitQueues
-int[][] timeGraph
-int[][] eleGraph
+putRequest()
+end()
}
class BuildingWaitQueue {
-boolean isEnd
-char building
-HashMap passengers
+addPassenger(Passenger)
+addPassengers(ArrayList)
+setEnd()
+getNearRequest(int, int) ArrayList
+hasTakeByPassenger(int, int, int) boolean
+getNearFloor(int) int
+hasPassenger(int, int) boolean
+needChangeDir(int, int) boolean
+getPassenger(int, int, int) ArrayList
+needEnd() boolean
}
class FloorWaitQueue {
-boolean isEnd
-char building
-HashMap passengers
+addPassenger(Passenger)
+addPassengers(ArrayList)
+setEnd()
+getNearRequest(int, int) ArrayList
+hasTakeByPassenger(int, int, int) boolean
+getNearFloor(int) int
+hasPassenger(int, int) boolean
+needChangeDir(int, int) boolean
+getPassenger(int, int, int) ArrayList
+needEnd() boolean
}
class BuildingElevator {
-char building
-int id
-int openTime
-int closeTime
-int moveTime
-BuildingWaitQueue
-int size
-int nowFloor
-int dir
-ArrayList inElevatorPassenger
+run()
+look()
+move(int)
+open()
+getOff()
+getIn()
+close()
+hasArrivedPassenger() boolean
}
class FloorElevator {
-char building
-int id
-int openTime
-int closeTime
-int moveTime
-BuildingWaitQueue
-int size
-int nowFloor
-int dir
-ArrayList inElevatorPassenger
+run()
+strategy()
+move(int)
+open()
+getOff()
+getIn()
+close()
+hasArrivedPassenger() boolean
}
class Passenger{
-PersonRequest personRequest
-int hordir
-int verdir
+getId() int
+getFromFloor() int
+getToFloor() int
+getFromBuilding() char
+getToBuilding() char
+gethordir() int
+getverdir() int
}
class Counter {
+add()
+release()
+setEnd(boolean)
+isEnd() boolean
}
Thread <|-- Input
Thread <|-- BuildingElevator
Thread <|-- FloorElevator
Scheduler <-- Input
BuildingWaitQueue <-- Scheduler
FloorWaitQueue <-- Scheduler
BuildingElevator <-- BuildingWaitQueue
FloorElevator <-- FloorWaitQueue
Passenger <.. BuildingWaitQueue
Passenger <.. FloorWaitQueue
Counter <-- Input
Counter <-- BuildingElevator
Counter <-- FloorElevator
2.2 类设计目的

​ 增加了Counter类控制线程结束。本次作业中输入线程结束且电梯所在楼或层等待队列为空不是结束条件,必须等待所有请求处理完毕后才能结束,所以使用Counter类计数已完成的请求和添加的请求。


2.3 电梯运行策略

​ 本次的换乘策略为最短路径。将50个地点建模为图的节点,每次添加请求时使用dij算法寻找最短路线。


3. 程序结构分析


3.1 各类代码量




















































































































FileTotal LinesSource Code LinesSource Code Lines[%]Comment Code LinesComment Code Lindes [%]Blank LinesBlank Lines[%]
BuildingElevator.java1881690.89893617021276660.031914893617021274130.06914893617021277
BuildingWaitQueue.java1401290.921428571428571400.0110.07857142857142857
Counter.java36290.805555555555555600.070.19444444444444445
FloorElevator.java2372110.89029535864978980.03375527426160337180.0759493670886076
FloorWaitQueue.java1841730.940217391304347810.005434782608695652100.05434782608695652
Input.java66590.893939393939393900.070.10606060606060606
Main.java34280.823529411764705800.060.17647058823529413
Output.java860.7500.020.25
Passenger.java1311070.81679389312977100.0240.183206106870229
Scheduler.java2622470.942748091603053420.007633587786259542130.04961832061068702

3.2 方法复杂度










































































































































































































































































































































































































































































































































































































































































MethodCogCev(G)iv(G)v(G)
BuildingElevator.BuildingElevator(char, int, int, int, int, int, BuildingWaitQueue, ...)0111
BuildingElevator.close()0111
BuildingElevator.compete()7177
BuildingElevator.getCpuTime()1122
BuildingElevator.getIn()5144
BuildingElevator.getInFirst(ArrayList

)

2133
BuildingElevator.getOff()12166
BuildingElevator.hasArrivedPassenger()3323
BuildingElevator.look()173810
BuildingElevator.move(int)0111
BuildingElevator.open()0111
BuildingElevator.run()10367
BuildingWaitQueue.BuildingWaitQueue(char)1122
BuildingWaitQueue.addPassenger(Passenger)1122
BuildingWaitQueue.getNearFloor(int)132810
BuildingWaitQueue.getPassenger(int, int, int)236913
BuildingWaitQueue.hasPassenger(int, int)5335
BuildingWaitQueue.isEnd()0111
BuildingWaitQueue.isNull()1122
BuildingWaitQueue.needChangeDir(int, int)9537
BuildingWaitQueue.needEnd()1122
BuildingWaitQueue.setEnd()0111
Counter.Counter()0111
Counter.add()0111
Counter.getInstance()0111
Counter.isEnd()1112
Counter.release()1122
Counter.setEnd(boolean)1122
FloorElevator.FloorElevator(char, int, int, int, int, int, FloorWaitQueue, ...)0111
FloorElevator.canOpen()1212
FloorElevator.close()0111
FloorElevator.compete()7177
FloorElevator.getCpuTime()1122
FloorElevator.getDir(int, int)2213
FloorElevator.getFloor()0111
FloorElevator.getIn()13177
FloorElevator.getInFirst(ArrayList

)

8166
FloorElevator.getOff()12166
FloorElevator.getReachAble()0111
FloorElevator.hasArrivedPassenger()3323
FloorElevator.isReachAble(int)0111
FloorElevator.move(int)2113
FloorElevator.open()0111
FloorElevator.run()10367
FloorElevator.strategy()183810
FloorWaitQueue.FloorWaitQueue(int)1122
FloorWaitQueue.addPassenger(Passenger)1122
FloorWaitQueue.getNearBuilding(char, int)274717
FloorWaitQueue.getPassenger(int, char, int, int)3191217
FloorWaitQueue.hasPassenger(int, char, int)136911
FloorWaitQueue.hasReachAbleRequest(int)8535
FloorWaitQueue.isNull()1122
FloorWaitQueue.needChangeDir(int, int)16759
FloorWaitQueue.setEnd()0111
Input.Input(HashMap, HashMap)0111
Input.run()16399
Main.main(String[])3144
Output.println(String)0111
Passenger.Passenger(PersonRequest)0111
Passenger.canTake()0111
Passenger.getFromBuilding()0111
Passenger.getFromFloor()0111
Passenger.getHorizontalDir()0111
Passenger.getId()0111
Passenger.getNextBuilding()0111
Passenger.getNextFloor()0111
Passenger.getNowBuilding()0111
Passenger.getNowFloor()0111
Passenger.getTarHorBuilding()0111
Passenger.getToBuilding()0111
Passenger.getToFloor()0111
Passenger.getVerticalDir()0111
Passenger.isNeedChange()0111
Passenger.setNeedChange(boolean)0111
Passenger.setNext(int, int)0111
Passenger.setNextBuilding(int)0111
Passenger.setNowBuilding(int)0111
Passenger.setNowFloor(int)0111
Passenger.setTarHorBuilding(int)0111
Passenger.toString()0111
Passenger.updateDir(int, int)10117
Scheduler.Scheduler()0111
Scheduler.addFloorElevator(FloorElevator)0111
Scheduler.gerInstance()0111
Scheduler.getNext(int, int[], int)201714
Scheduler.getShortPath(Passenger)181114
Scheduler.initGraph()17119
Scheduler.initial(HashMap, HashMap)1122
Scheduler.putRequest(Passenger)1311010
Scheduler.setEnd()2133
Scheduler.updateGraph(ElevatorRequest)6211722

四、线程协作


1. 第一、二次作业


2. 第三次作业


五、Bug分析

​ 本人在三次作业强测中均未出现bug,在第一次作业中由于没有注意到输出的线程不安全问题在互测中被hack。由于三次作业hack策略均为黑盒测试,并没有进行白盒测试,故不多加赘述。下面谈一些自己遇到的bug以及互测中hack到的bug。


1. 个人遇到的bug

​ 前两次作业实现过程中基本没有遇到棘手的bug,多为手抖引起的小bug,故此处多为第三次作业遇到的bug。

​ 第三次作业遇到的bug可分为两类,第一类是线程问题,主要是在输入线程结束至全部线程结束的过程中,电梯线程一直处于轮询的状态,产生了CTLE。第二类则是关于图的算法,本人在实现拆分请求的时候是根据最短路径拆分,然后根据当前位置和第一个换乘点确定将该请求放入哪一个等待队列。但没有考虑到横向移动过程中也可能涉及多次换乘。例如横向请求A-C,而电梯1为A-B,电梯2为B-C,此时需要告知将请求拆分为先去B座,再去C座。


2. 互测hack到的点

​ 互测中遇到的均多为线程问题,概括为两类,一类是由于线程协作不当导致不能正常结束;第二类是多个线程同时操作集和导致抛出错误。此外部分代码不能完成基本请求,以及没有正确实现第三次作业中横向电梯开关门的定制化。


六、心得体会

​ 线程安全问题方面,本单元没有遇到过线程不安全的情况,相较于初接触多线程编程时不明白哪里应该设为同步块,哪里使用wait哪里使用notify有了很大的提升。个人认为设计时就理清哪些是共享对象就能在很大程度上避免;此外条件判断时如果存在多个条件,则需要特别注意。

​ 关于层次化设计,我的设计怎么这么扁平呢。将一个复杂的电梯调度问题拆分到各个模块降低难度,能够有效帮助我理清思路,不至于过于混乱。

​ 一些学习体验与对课程建议:相较于去年的多电梯加night,random,morning三模式,今年的难度明显提升了,实验时给出了两种比较有参考意义的设计模式,个人认为可以再提供一些博客之类的参考资料?第二点是在我接触到的同学中有许多同学在设计伊始对synchronized,wait,notify的使用方法还是很模糊,有的同学暴力使用notifyAll导致了CTLE,这方面的资料也可以提供一些。

​ 一些设计过程中的心得:电梯调度策略不存在绝对的好与不好,对不同的情况性能不同,设计过程不要过于纠结,个人认为贴近生活中电梯的设计就可以取得不错的效果,毕竟这些策略已经经过了生活的检验。



推荐阅读
author-avatar
郭怡如珮尧琼江
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有