OO第二单元作业总结
OO第二单元作业总结
在本轮作业中,首次接触到了多线程的编程,通过最开始的操作系统线程管理到现在自己完成一个多线程程序,对多线程有了一些自己的认识。相比于单线程,多线程强调的是各个线程的“并发”执行,完成一些单线程无法完成的操作。
一、第五次作业
思路:本次的任务是模拟一个电梯的运行,仅仅通过多线程来实现电梯的基本功能,非常简单,主要实现了输入器和电梯运行的并行即可。
1.1程序结构分析
method |
ev(G) |
iv(G) |
v(G) |
elevator1.Console.AddTail(PersonRequest) |
1.0 |
1.0 |
1.0 |
elevator1.Console.Console() |
1.0 |
1.0 |
1.0 |
elevator1.Console.GetHead() |
1.0 |
3.0 |
3.0 |
elevator1.Console.IsEmpty() |
1.0 |
1.0 |
1.0 |
elevator1.Console.IsOver() |
1.0 |
1.0 |
1.0 |
elevator1.Console.MakeOver() |
1.0 |
1.0 |
1.0 |
elevator1.ElevatorMove.Close() |
1.0 |
1.0 |
1.0 |
elevator1.ElevatorMove.ElevatorMove(Console) |
1.0 |
1.0 |
1.0 |
elevator1.ElevatorMove.Move(int) |
2.0 |
1.0 |
2.0 |
elevator1.ElevatorMove.Open() |
1.0 |
1.0 |
1.0 |
elevator1.ElevatorMove.run() |
1.0 |
4.0 |
4.0 |
elevator1.ElevatorMove.SolveReq(PersonRequest) |
1.0 |
4.0 |
4.0 |
elevator1.Main.main(String[]) |
1.0 |
1.0 |
1.0 |
elevator1.ReqInput.ReqInput(Console) |
1.0 |
1.0 |
1.0 |
elevator1.ReqInput.run() |
3.0 |
4.0 |
4.0 |
Total |
18.0 |
26.0 |
27.0 |
Average |
1.2 |
1.73 |
1.8 |
1.2bug分析
在这次作业中,没有采用单例模式而采用了传参的方法,这是本次设计的一大不足之处。在实现上较为简单,公测时没出现bug。
二、第六次作业
思路:此次作业要求实现一个具有捎带功能的电梯,也就是说,需要考虑电梯的具体性能,于是,在上一次作业的基础上,增加了对请求调度的选择和裁定,来合理安排电梯的具体运行操作。在捎带实现上,选定当前最早的请求作为主请求,并在运行沿途不断加入可捎带请求,从而提高运行性能。
2.1程序结构分析
method |
ev(G) |
iv(G) |
v(G) |
elevator.Console.AddReq(PersonRequest) |
1.0 |
1.0 |
1.0 |
elevator.Console.Console() |
1.0 |
1.0 |
1.0 |
elevator.Console.GetCmd(int,int) |
4.0 |
14.0 |
24.0 |
elevator.Console.GetIn(PersonRequest,int) |
2.0 |
2.0 |
2.0 |
elevator.Console.getInstance() |
1.0 |
1.0 |
1.0 |
elevator.Console.GetOut(PersonRequest,int) |
2.0 |
2.0 |
2.0 |
elevator.Console.IsEmpty() |
1.0 |
2.0 |
2.0 |
elevator.Console.IsOver() |
1.0 |
1.0 |
1.0 |
elevator.Console.MakeOver() |
1.0 |
1.0 |
1.0 |
elevator.Console.Move(int,int,int) |
3.0 |
1.0 |
3.0 |
elevator.ElevatorMove.Close() |
1.0 |
2.0 |
2.0 |
elevator.ElevatorMove.ElevatorMove() |
1.0 |
1.0 |
1.0 |
elevator.ElevatorMove.Move(char) |
1.0 |
2.0 |
5.0 |
elevator.ElevatorMove.Open() |
1.0 |
2.0 |
2.0 |
elevator.ElevatorMove.run() |
1.0 |
4.0 |
4.0 |
elevator.ElevatorMove.SolveCmde(String) |
2.0 |
7.0 |
7.0 |
elevator.Main.main(String[]) |
1.0 |
1.0 |
1.0 |
elevator.ReqInput.ReqInput() |
1.0 |
1.0 |
1.0 |
elevator.ReqInput.run() |
3.0 |
4.0 |
4.0 |
Total |
29.0 |
50.0 |
65.0 |
Average |
1.5 |
2.6 |
3.4 |
2.2bug分析
在本次作业中,性能体现很差,经过检查,问题在于关门操作执行时间不对,会导致某些请求无法完成捎带,导致性能下降比较明显。
三、第七次作业
思路:本次作业在前两次的基础上,增加了多电梯的条件,并对电梯进行了进一步的限制,如限制了可停靠楼层和最大运送人数等,为调度增加了一定的难度。于是,为了实现基本的功能,采用了两级分配的方法,将所有的请求下发至各个电梯的请求队列由各自的调度器进行进一步处理。但,这样做的结果就是性能很低,因为使得大部分时间各个电梯无法彼此协调完成请求,浪费了很多时间。
3.1程序结构分析
method |
ev(G) |
iv(G) |
v(G) |
elevator.Console.AddCmd(int,int) |
4.0 |
4.0 |
5.0 |
elevator.Console.AddReq(PersonRequest) |
3.0 |
10.0 |
11.0 |
elevator.Console.check(int) |
1.0 |
3.0 |
3.0 |
elevator.Console.Console() |
1.0 |
1.0 |
1.0 |
elevator.Console.GetCmd(int,int,int) |
6.0 |
18.0 |
23.0 |
elevator.Console.GetIn(PersonRequest,int) |
2.0 |
2.0 |
2.0 |
elevator.Console.getInstance() |
1.0 |
1.0 |
1.0 |
elevator.Console.GetOut(Vector,PersonRequest,int) |
2.0 |
2.0 |
2.0 |
elevator.Console.Init(int,int,Vector) |
1.0 |
1.0 |
1.0 |
elevator.Console.IsEmpty(int) |
1.0 |
3.0 |
3.0 |
elevator.Console.IsOver() |
1.0 |
1.0 |
1.0 |
elevator.Console.MakeOver() |
1.0 |
1.0 |
1.0 |
elevator.Console.Move(int,int,int) |
3.0 |
1.0 |
3.0 |
elevator.Console.Wake() |
1.0 |
2.0 |
2.0 |
elevator.ElevatorMove.Close() |
1.0 |
2.0 |
2.0 |
elevator.ElevatorMove.ElevatorMove(int,int,Vector,int) |
1.0 |
1.0 |
1.0 |
elevator.ElevatorMove.Move(char) |
1.0 |
2.0 |
5.0 |
elevator.ElevatorMove.Open() |
1.0 |
2.0 |
2.0 |
elevator.ElevatorMove.run() |
3.0 |
4.0 |
5.0 |
elevator.ElevatorMove.SolveCmde(String) |
2.0 |
7.0 |
7.0 |
elevator.Main.main(String[]) |
1.0 |
6.0 |
8.0 |
elevator.ReqInput.ReqInput() |
1.0 |
1.0 |
1.0 |
elevator.ReqInput.run() |
3.0 |
4.0 |
4.0 |
Total |
42.0 |
79.0 |
94.0 |
Average |
1.8 |
3.4 |
4.0 |
3.2bug分析
在本次的强测中,除了性能表现差外,无其他bug出现。如果想进一步提升性能,应当在调度上进行动态分配,每次处理请求时,需要综合考虑三部电梯的当前运行状态,从而做出较优的决策。
四、多线程编程的心得体会
在多线程编程中,最重要的就是程序架构的设计,如何通过设计多线程来实现并行,并在此基础上完成线程间的交互。在多线程的设计上,最好的方式应该是保证线程间功能的独立性,降低耦合度,减少共享变量的使用。在不可避免的使用共享变量时,就会面临线程间的数据安全问题,需要使用同步关键词来获取对象的锁,之后再进行操作。同时需要注意的是,在同步语句嵌套时,要避免出现线程死锁,如果两个同步语句嵌套方式不当,会使得程序陷入死锁。在使用共享变量的基础上,需要进行线程间的通讯,一个比较好的方法便是利用对象来生成线程锁,较方便的完成线程通讯。
虽然这次的作业性能分很低,但是写的终于像个java工程了,不像上次作业基本是按照面向过程来组织的,导致代码扩展性很差,而这次对于新的任务,只需要修改很少的一部分代码就可以完成,找到一点面向对象的感觉。
在设计程序架构时,会发现已有的一些模式非常高效,对于工程的完成有很大的帮助,在以后的作业中,应该会首先查询相关的程序架构然后再自行拓展,这样应该会提高编码的效率降低debug的难度。架构确定后,会集中在性能的提升上,进一步提高代码的整体质量。