软件工程第四次作业
软件工程第四次作业
博客信息 | 沈阳航空航天大学计算机学院2020软件工程作业 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10685 |
课程目标 | 熟悉一个“高质量”软件的开发过程 |
作业目标 |
结对编程练习 |
题目:电梯调度问题
本次作业我担任了驾驶员的角色,编写了全部的代码,这个题目比较吸引人,所以选择了电梯这个题目,因为自己对多线程编程掌握的还不熟练,所以略去了电梯的超重问题。使用两类线程:
电梯线程和乘客线程,并多次使用wait和notify来实现乘客上电梯与下电梯的同步。
使用了这几个全局变量来实现线程间的同步,如下:
private static String LOCK1="LOCK1"; private static String LOCK2="LOCK2"; static int statefloor1=1; static int statefloor2=1; static List<Passenger> requestque1=new ArrayList<Passenger>(); static List<Passenger> requestque2=new ArrayList<Passenger>(); static List<Passenger> requestque3=new ArrayList<Passenger>(); static List<Passenger> requestque4=new ArrayList<Passenger>();
其中使用List型的数组型集合把Passenger(乘客)看成元素,乘客中包含了状态(state),初始的楼层(inifloor),需要到达的楼层(requestfloor)。
List集合中的乘客作为电梯调度要处理的依据。新来一个乘客时,即新创建一个乘客型线程时,就在它的构造函数中把此乘客信息加入相应的List队列中去,使用List.add(this)。这样新加入的乘客信息在队列的最后一个,而乘客Passenger类implements了Comparable接口,并重写compareTo()函数,这样可以根据乘客信息对列表进行排序,以便完成调度。
需要为每一个电梯创建一个单独的队列,而且是static的,保存在内存中,为每个线程所共享,statefloor1等也是为每个电梯所创建的当前电梯所在层,以用于乘客和电梯的同步。
在这其中要保证当乘客上电梯以后(state=1),才能让电梯继续运行到所需到达的楼层。用了两个同步块,定义为LOCK1和LOCK2来进行同步,当电梯到达乘客所在初始楼层时,判断其state(程序中为requestque.get(i).state)是否为1,若为1,则继续运行,若不为1,为0,则唤醒乘客线程,告诉他“我已经到了”,然后等待其上电梯(LOCK1.wait()),乘客上完电梯后,唤醒电梯线程。同理,下电梯过程也用类似的方法同步。
乘客类中的成员变量和构造函数如下:
int inifloor; int name; int requestfloor; int statefloor; int elenumber; int state; Passenger() { inifloor=1; statefloor=1; state=0; requestfloor=2; } Passenger(int inifloor,int requestfloor,int elenumber,int name) { this.inifloor=inifloor; this.requestfloor=requestfloor; statefloor=inifloor; this.elenumber=elenumber; this.name=name; state=0; if(elenumber==1) { requestque1.add(this); } if(elenumber==2) { requestque2.add(this); } if(elenumber==3) { requestque3.add(this); } if(elenumber==4) { requestque4.add(this); } }
电梯类的成员变量如下:
static class NewElevator1 extends Thread { int censhu; int inifloor; int statefloor; int number; List<Passenger> requestque=new ArrayList<Passenger>(); NewElevator1() { inifloor=1; statefloor=1; censhu=20; number=1; requestque=null; } NewElevator1(int censhu,int inifloor,int number) { this.censhu=censhu; this.inifloor=inifloor; this.number=number; statefloor=inifloor; }
***代码链接如下:***
<https://github.com/Trumpetertimes/Trumpetertimes-dock/blob/master/For%204th%20homework%20of%20SE>
讨论
我们对电梯的同步处理做了很多讨论,由于都是在一个java包里写的代码,修改调试的时候显得十分繁琐,有时候找不到代码的位置,找到以后又忘了刚才的想法,十分麻烦,以后应该写这样比较复杂的程序的时候在两个包或者两个Class文件中编写,比较容易调试和查看
部分运行结果