软件工程第四次作业

软件工程第四次作业

博客信息沈阳航空航天大学计算机学院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文件中编写,比较容易调试和查看

部分运行结果

 

posted @ 2020-04-29 22:58  Siuhamburger  阅读(223)  评论(0编辑  收藏  举报