面向对象课程第二单元总结

  本单元的整体多线程冒险体验对于我来说是要比第一单元好的……原因无他,我第一单元栽倒在输入处理和正则上的比例有点高,感觉除了设计上的丑陋之处,其他的全是输入处理上的问题= =……

  当然这并不代表本单元的冒险不紧张刺激,但至少省下输入处理的精力,我在代码结构的构造上面还是下了功夫的,整体构造感觉上要比第一单元更加合理一些(也许代码度量插件不这么想orz)。这其中也有老师教的合理的多线程设计模式的功劳,在已有的框架内,会把生产者消费者、仓库工人等等线程类所要完成的工作规定清楚,避免上帝类、废物类、奇怪线程类的出现。

  另外的收获就是对于多线程同步机制以及线程间通信的感悟。尤其是第二次作业为了照顾设计成丑八怪的调度算法,写了个二重生产者消费者机制,线程同步挂了很长一段时间才调好,具体还是留到底下作业分析之中细说。

第一次作业

  总体设计:使用生产者消费者模式,将输入作为生产者,将电梯作为消费者,将调度器作为共享对象。

  算法设计:由于规定是傻瓜调度,所以我并没有在算法优化上下功夫,只是进行了优化的思考,怕为了一口气吃个胖子把代码搞错。生产者没啥好说的,channel类也和课上介绍的差不多,消费者采用拿不到指令就wait(),拿到指令直接傻瓜调度跑完的方式,所有的输出一并写到了消费者类中。

  测试结果:强测以及互测均未出现问题。

第二次作业

  总体设计:使用一个非常杂技的双重生产者消费者模式, 生产者给仓库指令,消费者取走并自己维护一个队列(由于涉及到后续处理,必须要维护一个队列),然后把指令分为两部分,一部分作为可捎带指令直接喂给电梯线程类,另外一部分作为不可捎带指令存入一个叫做requestbuffer类做缓冲,再由电梯线程成批次取走。

  算法设计:整体实现上非常类似于look算法(只是类似,毕竟结果显示我算法还是写错了一些东西的),逐层进行指令的扫描,消费者队列为空时则去requestbuffer抓指令,抓一次把同方向的一批都抓走并从最远端开始运行电梯(向上就是最下一层,向下就是最上一层)。想的还是比较周到,但实际上构造起来过于杂技,缺点也比较明显。比如look算法没考虑队列所有指令,只按队列第一条确定下一步运行方向,在性能分上完全得不到保证;把电梯拉到最远端的初始化方法还很容易出错,比如说初始化的同时进入了一个由消费者线程喂过来的同向路上上车的指令,我就完全无法在本架构上处理(后来BUG中发现的,大改了一番才处理好)……类似的算法也在第三次得到了优化。

  测试结果:初始化的同时进入了一个由消费者线程喂过来的同向路上上车的指令无法处理导致了强测互测的一半错误,另一半是某个布尔变量初始化错了,导致按批去缓冲区抓来的指令有可能无法被我设计的初始化处理……actually,错误比较微妙,乍一测不好测出来,我当时对程序有些过于放心了,想的太少……

未完待续

原文地址:https://www.cnblogs.com/xsndzxc/p/10739622.html

时间: 2024-07-31 05:39:15

面向对象课程第二单元总结的相关文章

面向对象课程第二次随笔

多线程的协同与同步控制 第五次作业 作为第一次多线程作业,对于多线程的同步和协同机制还不是非常了解.在这次作业中,我将三个电梯作为了三个线程,输入线程和调度器线程进行辅助.输入线程和调度器线程之间采取了很简单的生产者消费者模式来进行指令的传递.比较重要的是调度器与三个电梯之间的协同,共享资源为指令与电梯的状态.由于要考虑电梯的状态进行分配指令,电梯状态的同步是十分重要的,我在电梯类中设计了一个专门的方法返回电梯状态并将这个方法synchronized来保证调度器获得的电梯状态与实际电梯状态的同步

BUAA_OO 第二单元总结

BUAA_OO 第二单元总结 写在前面 ? 多线程(multi-threading)是指从软件或硬件上实现多个线程并发执行的技术.现代处理器普遍具有多核的特点,支持同一时间执行多个线程,使用多线程技术可以提高程序并发度,整体提高处理性能.因此掌握多线程程序设计技术是CS学习必不可少的一部分. ? 多线程程序设计包括线程协同控制.线程安全保证以及线程程序设计模式等.本文主要总结OO课程第二单元所学的有关多线程程序设计的知识,实践体会,以及技术注记,以备后用. 第五次作业 ? 第五次作业实现了一个单

面向对象第二单元训练总结

一.前言 第二单元的三次作业是很有特点的三次作业.多线程电梯的设计思路和前两次电梯作业迥然不同,导致我花费了大量的时间去重构之前的代码,使其适应多线程电梯的作业要求:文件监视器是一个独立的作业,不像电梯和出租车那样是一个系列,因此写起来没什么包袱,感觉并不困难:出租车调度和多线程电梯写起来感觉比较相似,但出租车几乎没有算法上的难度,因此主要的工作都花费在了如何构建一个好的设计上面.这三次作业之间看起来没有什么关联,但却环环相扣,一步一步加深着我对多线程编程的理解. 我对这三次作业的总体难度评价为

MOOC 面向对象软件开发实践之基本技能训练 第二单元作业

这几天期末考试周  bolg 比较忙 停更了几天 晚上还是抽空把金老师第二单元的作业给做了 基本功能都实现  对象多对多信息交换  对象序列化  等等内容 都一一实现了 确实对初学OOP的人来说 很有帮助  代码就不给了 很简单 自己努力google 或者留言你的问题

C#面向对象课程 类与对象,方法重载,类的静态成员,命名空间和类库12月22日

一.类是面向对象课程的基本单元. 在类的里面可以直接定义字段(成员变量),也可以定义方法(函数). 例如: 这里的public是修饰符,修饰符的作用是用来限定它的可访问范围. 两个同范围(同一个类中,或者父子类中)两个同名但参数类型不同或者参数个数不同的方法互相间构成重载关系. 两个构成重载关系的方法(函数)必须满足以下条件: (1)方法(函数)名相同: (2)参数类型不同,或参数个数不同.这里需要注意的是,函数返回值类型的不同不是函数重载的判断条件. 二.静态成员 属性.方法和字段等成员是对象

第二单元总结

######第二单元###### #########################linux系统结构####################### 1. linux系统结构是倒树型 2. /bin                ##二进制可执行文件也就是系统命令 /sbin               ##系统管理命令存放位置 /boot               ##启动分区,负责系统启动 /dev                ##设备管理文件 /etc                #

第二单元练习题

<<<第二单元练习>>> 1.用命令和正则表达式按照要求建立文件 *)用一条命令建立12个文件WESTOS_classX_linuxY(X的数值范围为1-2,Y的数值范围为1-6) *)这些文件都包含在root用户桌面的study目录中 *)用一条命令建立8个文件redhat_versionX(x的范围为1-8) *)redhat_virsionX这些文件都包含在/mnt目录中的VERSION中 2.管理刚才信建立的文件要求如下 *)用一条命令把redhat_versi

第二单元. &nbsp; 简要的正则表达式及文件的移动复制

第二单元 1.用命令和正则表达式按照要求建立文件 *)用一条命令建立12个文件WESTOS_classX_linuxY(X的数值范围为1-2,Y的数值范围为1-6) *)这些文件都包含在root用户桌面的study目录中 [[email protected] Desktop]# touch study/WESTOS_class{1,2}_linux{1..6} [[email protected] Desktop]# mv study/WESTOS_class{1,2}_linux{1..6}

.C#认证考试试题汇编:第一单元:1,11 第二单元:1,11

第一单元1,11 好久没用异或都快忘了,就让我们一起来了解哈啥子事异或 说的这个,就不经意让我想起书上的几种交换值得方法了 我这儿说的交换的方法是,不使用第三个变量来交换,而是两个 实现条件是C a=100,b=10;第一种 缺点可能会如果超出范围溢出a=a+b; a=110,b=10b=a-b; b=100,a=110a=a-b; a=-10,b=100b=100,a=10;第二种 缺点可能会如果超出范围溢出a=a*b;a=1000,b=10b=a/b;b=100,a=1000a=a/b;a=