华中科技大学计算机第四次作业,软件工程第四次作业

软件工程第四次作业

题目:电梯调度问题

本次作业我担任了驾驶员的角色,编写了全部的代码,这个题目比较吸引人,所以选择了电梯这个题目,因为自己对多线程编程掌握的还不熟练,所以略去了电梯的超重问题。使用两类线程:

电梯线程和乘客线程,并多次使用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文件中编写,比较容易调试和查看

a2df032c221907067c3af28d0a07208c.png

部分运行结果

afccdf2660fbf8afda70c421ef71b373.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值