1.总体架构及分析线程之间的关系、如何处理交互
主线程负责创建电梯线程,input线程,以及建立电梯和input、电梯和电梯之间共享的类。
电梯的核心部分就是判断状态:
第一次作业:
乘客指定了电梯,线程之间的交流主要是电梯和input之间通过request,电梯需要判断状态,当电梯发现request列表为空以及电梯内部乘客为空时,需要wait(),来减少对cpu的消耗,当input分配给request任务时,需要notify()
第二次作业:
乘客未指定电梯,且电梯会reset,笔者使用的是随机分配,需要增加一个waitrequest列表来表示哪些电梯是可以被分配任务的,reset期间电梯应当离开waitrequest列表,因为两个线程共享它,需要注意同步和互斥,具体实现是上锁,解锁。
第三次作业:
电梯会变成双桥厢,增加的内容其实就是两个双桥厢电梯间的沟通,笔者增加了一个类来表示transFloor是否为空,以及两个电梯什么时候可以结束。与第一次作业不同的是,当伙伴电梯还在运行的时候,该电梯不能结束,可能伙伴电梯还会给它运人。
具体实现不碰撞的代码如上,在准备移动时判断下个楼层是否是transFloor,如果被占用就等待。
二、debug
简单测试:测试一下电梯是否能正常送人,双桥厢电梯是否可以简单协作等等,输入一条指令就可以。
用投喂包可以实现更进一步的测试。
关于ctle,一般就是发生了轮询,一般出现在run的while(true),更一般的就是各个循环,可以print来看看哪里出现了问题。
随机算法不太好debug,同一数据很难复现出现的bug。
三、心得体会
关于多线程,一定要先弄清楚线程之间的关系,线程之间的通信部分写的清晰有助于debug,这个单元真是一个难忘的单元。