zoukankan      html  css  js  c++  java
  • 软件工程第四次作业

    软件工程第四次作业

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

    部分运行结果

  • 相关阅读:
    i++ 与++i
    jquery下的domcument
    jquery
    MVC MVP MVVM
    两个for还是一个for?
    华为云服务器FTP连接
    vue-i18n 使用方法
    在本地运行vue build 文件
    vue项目中使用模拟数据 MOCK
    超简单 超详细 vue项目中使用svg图标 阿里巴巴图标库
  • 原文地址:https://www.cnblogs.com/Trumpetertimes/p/12805705.html
Copyright © 2011-2022 走看看