软件工程第四次作业
题目:电梯调度问题
本次作业我担任了驾驶员的角色,编写了全部的代码,这个题目比较吸引人,所以选择了电梯这个题目,因为自己对多线程编程掌握的还不熟练,所以略去了电梯的超重问题。使用两类线程:
电梯线程和乘客线程,并多次使用wait和notify来实现乘客上电梯与下电梯的同步。
使用了这几个全局变量来实现线程间的同步,如下:
private static String LOCK1="LOCK1";private static String LOCK2="LOCK2";static int statefloor1=1;static int statefloor2=1;static List requestque1=new ArrayList();static List requestque2=new ArrayList();static List requestque3=new ArrayList();static List requestque4=new ArrayList();
其中使用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()),乘客上完电梯后,唤醒电梯线程。同理,下电梯过程也用类似的方法同步。
乘客类中的成员变量和构造函数如下:
intinifloor;intname;intrequestfloor;intstatefloor;intelenumber;intstate;
Passenger()
{
inifloor=1;
statefloor=1;
state=0;
requestfloor=2;
}
Passenger(int inifloor,int requestfloor,int elenumber,intname)
{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 extendsThread
{intcenshu;intinifloor;intstatefloor;intnumber;
List requestque=new ArrayList();
NewElevator1()
{
inifloor=1;
statefloor=1;
censhu=20;
number=1;
requestque=null;
}
NewElevator1(int censhu,int inifloor,intnumber)
{this.censhu=censhu;this.inifloor=inifloor;this.number=number;
statefloor=inifloor;
}
***代码链接如下:***
讨论
我们对电梯的同步处理做了很多讨论,由于都是在一个java包里写的代码,修改调试的时候显得十分繁琐,有时候找不到代码的位置,找到以后又忘了刚才的想法,十分麻烦,以后应该写这样比较复杂的程序的时候在两个包或者两个Class文件中编写,比较容易调试和查看
部分运行结果