第二單元做業——電梯系列

第二單元做業——電梯系列

單元做業總結

  • 電梯系列是第一次接觸線程、鎖等概念,也是第一次進行多線程編程。
    順利的完成了三次做業,實現了多線程,算是基本的進步。
    課下學習的主要資源記錄以下:
    Java併發編程-入門篇不少Java併發編程的基礎知識都是看其中博客學習的。java

  • 可是本次做業問題比取得的進步多太多,三次做業也有兩次大翻車,問題在於測試不夠認真。這個在之後的做業要多加註意改進。git

分析總結做業設計策略。

第一次做業

  • 傻瓜電梯。單線程多線程都能成功,運用了單例模式和消費者生產者模型。github

  • 單例模式以下
public class Singleton {
    private static volatile Singleton singleton; private Singleton() {}
    public static Singleton getInstance() { 
        if (singleton == null) {
            synchronized (Singleton.class) { 
                if (singleton == null) {
                    singleton = new Singleton(); 
                }
            } 
        }
        return singleton; 
    }
}
  • 以及消費者生產者模型
public class Producer extends Thread { 
    private Tray tray; 
    private int id; 
    public Producer(Tray t, int id) {
        tray = t; 
        this.id = id; 
    } 
    public void run() {
        int value;
        for (int i = 0; i < 10; i++)
            for(int j =0; j < 10; j++ ) {
                value = i*10+j;
                tray.put(value); 
                System.out.println("Producer #" + this.id + " put: ("+value+ ").");
        try { 
            sleep((int)(Math.random() * 100)); 
        } catch (InterruptedException e) { }
            }; 
        }
    }
}

public class Consumer extends Thread { 
    private Tray tray;
    private int id;
    public Consumer(Tray t, int id) {
        tray = t; 
        this.id = id; 
    } 
    public void run() {
        int value = 0;
        for (int i = 0; i < 10; i++) {
            value = tray.get();
            System.out.println("Consumer #" + this.id + " got: " + value); 
        } 
    }
}

public class Tray {
    private int value; 
    private boolean full = false; 
    public synchronized int get() {
        while (full == false) {
            try { wait(); } catch (InterruptedException e) { } 
        }
        full = false; // 􏰐􏰜full􏰖true􏰗􏱬􏰖false􏰚􏰓􏰣􏰥􏰟􏰑􏰡􏰛􏱋􏱃􏰞􏰕􏱟􏰔􏰙
        notifyAll();
      return value;
    }
    
    public synchronized void put(int v) { 
        while (full == true) {
            try { 
                wait();
            } catch (InterruptedException e) { } 
      full = true; 
      value = v; 
      notifyAll();
    }
  }
}

第二次做業

  • 加入ALS電梯,引入觀察者模式
private void notifyObservers() { 
    Vector<Observer> obs=null; 
    synchronized(MONITOR) {
        if(mObservers !=null)
            obs = mObservers.clone();
    }
    if (obs != null) {
        for (Observer observer : obs) { 
            observer.onObservableChanged();
        }
    }
}
  • 捎帶,是平常電梯中很是常見的一種調度,這裏要求很是多的對象之間的交互,每一個對象只作他應該要作的事情,對象和對象之間所作的事情應該平均

第三次做業

  • 多線程智能電梯
    • 引入開閉原則和工廠模式
    • 加入兩個學習連接,開閉原則工廠模式
    • 多部電梯,對線程間交互提出了更高的要求,線程安全要求也越高了。

基於度量的分析

  • 三次做業中,第一次做業最容易,類圖也最簡單,各類度量標準也最簡單。
  • 第二次做業最複雜,可是第三次又取得了進步。

第一次做業

h5類圖

h5_type

h5_method

第二次做業

h6類圖

h6_type

h6_method

第三次做業

h7類圖

h7_type

h7_method

本身Bug分析

  1. 程序結束問題較大,第三次做業獲得修復
  2. 存在過分複雜的難以維護的容易出錯的類,第三次做業獲得改進

別人Bug分析

  • 多采用黑盒測試
  • 沒找到別人的bug。

心得體會

  • 本次做業學會了單例模式、開閉模式、工廠方法
  • 學會了多線程編程、鎖機制。
  • 程序測試方法還須要多加學習
相關文章
相關標籤/搜索