1. 程式人生 > >201621123041java程序設計第十一周學習總結

201621123041java程序設計第十一周學習總結

程序 repo 提高 區別 程序代碼 時間 停止 name ade

1. 本周學習總結

  • 技術分享圖片

2. 書面作業

1. 源代碼閱讀:多線程程序BounceThread

1.1 BallRunnable類有什麽用?為什麽代碼中需要調用Thread.sleep進行休眠?

  • 編寫了兩個方法public BallRunnable(Ball aBall, Component aComponent)public void run(),使用Thread.sleep會讓線程會從“運行狀態”進入到“休眠(阻塞)狀態”。sleep()會指定休眠時間,線程休眠的時間會大於/等於該休眠時間;在線程重新被喚醒時,它會由“阻塞狀態”變成“就緒狀態”,從而等待cpu的調度執行。

1.2 Ball.java只做了兩件事,這兩件事分別是什麽?BallComponent對象是幹什麽的?其內部的ArrayList有什麽用?程序運行過程中,生成了幾個BallComponent對象?該程序使用了多線程技術,每個小球是分別在不同的線程中進行繪制嗎?

  • 兩件事分別是move()(將一個Ball實例添加進名為Balls的ArrayList)和getShape()(遍歷Balls,將每個ball繪制在畫面上)。

2. 實驗總結:題集(多線程)

2.1 題目:Thread、PrintTask、Runnable與匿名內部類。

並回答:a)通過定義Runnable接口的實現類來實現多線程程序比通過繼承自Thread類實現多線程程序有何好處?b) 6-1,6-3,6-11實驗總結。

  • Runnable接口適合多個相同程序代碼的線程去處理統一資源的情況,把線程同程序的代碼,數據有效分離,能夠較好的體現了面向對象的設計思想,可以避免由於java的單繼承特性帶來的局限,增強了程序的健壯性,代碼能夠被多個線程共享,代碼與數據時獨立的。

2.2 使用Lambda表達式改寫6-3

  • public static void main(String[] args){
    final String mainThreadName = Thread.currentThread().getName();
    Thread t1 = new Thread(() -> {
    System.out.println(mainThreadName);
    System.out.println(Thread.currentThread().getName());
    System.out.println(Arrays.toStringThread.currentThread().getName()));
    });
    t1.start();
    }

2.3 題目:6-2(Runnable與停止線程)。回答:需要怎樣才能正確地停止一個運行中的線程?

    1. 使用violate boolean變量來標識線程是否停止
  1. 停止線程時,需要調用停止線程的interrupt()方法,因為線程有可能在wait()或sleep(), 提高停止線程的即時性
  2. 對於blocking IO的處理,盡量使用InterruptibleChannel來代替blocking IO

3. 互斥訪問

3.1 修改TestUnSynchronizedThread.java源代碼使其可以同步訪問。(關鍵代碼截圖,需出現學號)

  • 技術分享圖片

4. 互斥訪問與同步訪問

完成題集6-4(互斥訪問)與6-5(同步訪問)

4.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什麽辦法可以使用synchronized實現互斥同步訪問,使用代碼說明(請出現相關代碼及學號)?

  • 技術分享圖片
    技術分享圖片

4.2 同步代碼塊與同步方法有何區別?

  • 同步方法直接在方法上加synchronized,同步代碼塊只有在方法內部才能加鎖。

4.3 實現互斥訪問的原理是什麽?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麽變化的?

  • 當有某個進程訪問這段代碼,給這段代碼加鎖,使其不能被其他任務訪問,直到該代碼解鎖後才能被其他任務執行。poolLock.unlock(),這時候在Lock Pool的線程才可以繼續,TestUnSynchronizedThread.java)執行synchronized同步方法。

4.4 Java多線程中使用什麽關鍵字實現線程之間的通信,進而實現線程的協同工作?

  • 使用wait()、notify()來實現線程之間的協同工作。同步訪問一般都要放到synchronized方法或者代碼塊中是為了避免出現多個線程訪問同一個代碼塊時會導致的運行結果出錯的情況。

5. 線程間的合作:生產者消費者問題

5.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,並回答:結果正常嗎?哪裏不正常?為什麽?

  • 不正常。會出現倉庫還有剩余貨物的情況,生產者與消費者的存取速度不相同。

5.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)

  • public synchronized void add(String t){
    while(repo.size()>=capacity){
    System.out.println("倉庫已滿")
    try{
    wait();
    } catch(InterruptedExprction e){
    e.printStackTrace();
    }
    }
    repo.add(t);
    System.out.println("庫存:"+repo.size());
    notify();
    } //201621123041 林裕恒
    public synchronized void remove(){
    while(repo.size()<=0){
    System.out.println("倉庫無貨");
    try{
    wait();
    } catch(InterruptedExprction e){
    e.printStackTrace();
    }
    }
    repo.remove(0);
    System.out.println("庫存:"+repo.size());
    notify();
    }

    6. 面向對象設計作業-圖書館管理系統

6.1 系統的功能模塊表格,表格中體現出每個模塊的負責人。

  • 註冊登錄類:林裕恒

6.2 運行視頻

6.3 講解自己負責的模塊,並粘貼自己負責模塊的關鍵代碼(出現學號及姓名)。

  • 技術分享圖片
    技術分享圖片
    技術分享圖片

3.1. 碼雲代碼提交記錄

  • 技術分享圖片
    技術分享圖片

3.2 截圖"多線程"PTA提交列表

3.3 統計本周完成的代碼量

周次 總代碼量 新增代碼量 總文件數 新增文件數
5 221 221 4 4
6 487 226 10 6
7 837 350 14 4
8 1057 220 17 3
9 1289 232 21 4
10 1654 365 26 5
11 1989 335 32 6
12 2291 302 39 7

201621123041java程序設計第十一周學習總結