OOunit2总结

同步块的设置和锁的选择

本单元作业各线程间共同使用的只有waitQueue这一未被分配的请求队列(InputThread对其添加请求,Schedule对其分配,各Process进行取请求),所以有关waitQueue的方法都需要上锁保证线程安全;为了能正确执行程序并正常结束,其中的wait与notify需要好好设置,我在isEnd,setEnd与增加请求、取请求进行notify以保证schedule的“早起”。

第三次作业中是如何实现双轿厢的两个轿厢不碰撞

本次博客完成时我尚未彻底完成第三次作业,该处答案尚属于半成品:在到B达换乘楼层前判断A是否将要进入换乘楼层,若是,则等待A离开后唤醒使其移动到换乘楼层。

总结分析三次作业中的调度器设计,并分析调度器如何与程序中的线程进行交互;总结分析三次作业中的调度策略,并分析自己的调度策略是如何适应时间、电量等多个性能指标的

对于调度器分配指令,我选择了类似“最差适应”的预测权重算法:

public double getWeight(int position) {
        double a = (position > this.floor) ? (position - this.floor) : (this.floor - position);
        if (main != null) {
            if ((this.floor - position) * (main.getToFloor() - position) > 0) {
                a = a + speed * 10;
            }
        }
        if (ifFull()) {
            return a * speed + capacity * 0.4 + waitRequests.size() * speed * 6;
        } else {
            return a * speed + requests.size() * 0.4;
        }
    }

对于每个新进请求,在电梯不满时预计该请求上电梯前已上电梯的请求都将下电梯;

对于已经满员的电梯,对其每个多出的请求增添一定运行的权重惩罚;

对于方向与电梯当前主请求方向相反的请求,增添一定时间的权重惩罚。

仅仅是简单的模拟就能获得大半数据点90以上的性能分数,相性最好的数据点性能分更是高达99.89。相比于实力强劲但实现相对复杂得多的“影子电梯”有简单很多的优势。而评分较低的数据点则是由于我的运行逻辑使得指令在取到时就立刻进行分配并输出receive,而reset中的电梯不允许receive请求,面对多部电梯同时reset时会出现未reset的电梯“不堪重负”的情况。因此,我还设计了暂存队列,保证每部电梯存储的请求不会过多:

if (nearestEid == -1 || processes.get(nearestEid).getWaitNum() > 10) { //全被占用,暂存
                    waitReset.add(request);
                }

暂存处理的效果也是立竿见影的,在修改后,有这类情况的数据点平均减少了20s运行时间。

debug方法

由于本次作业各个线程运行使用的判断条件较多,我多次出现因为对判断条件处理不完全导致的轮询:通过积极使用输出语句输出线程卡死时的判断条件状态有助于迅速完善运行判断条件。

/*System.out.println("main in elevator : " + requests.contains(main));
        System.out.println("main is out : " + waitRequests.contains(main));
        System.out.println("processingQueue.isEmpty() : " + processingQueue.isEmpty());
        System.out.println("processingQueue.isEnd() : " + processingQueue.isEnd());
        System.out.println("have main : " + !(main == null));
        System.out.println("requests.size() : " + requests.size());
        System.out.println("waitRequests.size() : " + waitRequests.size());
        System.out.println("now elevator at " + floor + " floor");
        if (main != null) {
            System.out.println("main : " + main.getFromFloor() + " to " + main.getToFloor());
        }*/

作业架构

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值