一. 设计策略
1. 架构设计
三个线程:电梯,调度器,主线程(输入线程), 采用worker thread,生产者消费者模式。和同学讨论,发现有的观点认为:调度器更像是一个功能的集合,类似一个函数,不像是一个主体,而且线程越少bug一般而言越少,于是调度器不做为线程。也挺有道理。架构图如下:
其中task使用ConcurrentHashmap实现,对其方法没有加synchronized, request使用普通List实现, 对其public方法都加了synchronized。这两个类作为被多个线程访问的类,进行了同步控制。
main向request中放入请求,调度器从request中拿出请求并分配给一个电梯(放进该电梯的task处),电梯从自己的task中拿出请求并执行,car是电梯的轿厢,代表电梯内的请求。此种实现方式不是电梯去向调度器要任务,而是调度器主动分配任务给电梯。整个架构耦合度较低。
2. 调度算法设计
将调度分解成两个独立的过程:分配电梯,分配到达楼层。
分配电梯的算法如下: