1 同步块设置和锁的选择
线程:controller调度器线程、elevator电梯线程、input输入线程
输入线程识别到新请求时,用synchronized锁住调度器线程,更新总等待队列或增加电梯。
当电梯线程需要改变电梯位置或者上下乘客时,用synchronized锁住调度器线程,更新电梯内外乘客队列。
2 调度器设计与线程交互
controller:调度器线程
定义等待请求阻塞队列:从输入中分析的乘客请求
线程运行:循环
乘客等待请求队列非空:分配乘客到合适的电梯
乘客等待请求队列为空:轮询,每0.1秒
线程终止:输入线程终止且没有待分配乘客且没有电梯还有乘客请求
捎带:遍历待分配乘客,遍历电梯,如果该电梯前进方向能经过乘客起始楼层,就让该乘客在该电梯等待队列中等待。并且将捎带标记改为true。
未捎带:如果没有捎带成功,让乘客在特定电梯队列中等待
elevator:电梯线程
定义辅助阻塞队列:电梯内的下电梯请求、电梯外的上电梯请求
定义辅助标记数组:电梯内请求需要停下的楼层、电梯外请求需要停下的楼层
电梯状态:
静止或回到初始位置:内外无请求
运动:
开门、上下客、关门 --- 电梯位置在标记处时
上升 --- 电梯位置在最低标记处之下时
下降 --- 电梯位置在最高标记处之上时
线程运行:轮询,每0.1秒更新标记数组,更新电梯状态
线程终止:调度器线程终止且无内外乘客请求时,电梯线程终止
UML图
bug策略
1 观察代码看是否存在线程安全和死锁的可能性
2 输入边界数据
心得体会
第一次接触多线程,刚开始时有些手足无措无从下手。
第一次作业注意后续的可扩展性,为后续作业提供了方便。