1. 程式人生 > >201621123057 《Java程序設計》第11周學習總結

201621123057 《Java程序設計》第11周學習總結

lambda 構造 call 技術分享 body 幹什麽 固定位置 ets 信息

1. 本周學習總結

1.1 以你喜歡的方式(思維導圖或其他)歸納總結多線程相關內容。
技術分享圖片

2. 書面作業

本次PTA作業題集多線程

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

1.1 BallRunnable類有什麽用?為什麽代碼中需要調用Thread.sleep進行休眠?
答:
BallRunnable 類 implements Runnable 接口,給線程任務;在其中的run方法中調用move()和repaint()函數實現運動軌跡。
調用Thread.sleep進行休眠是為了延緩線程完成的時間,以便我們能夠看到小球的移動過程。

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


答:

  • 定義實現了move()函數;定義了getShape()函數來得到小球的大小和坐標位置;
  • BallComponent中,完成了“添加小球”、“畫出小球”兩項任務;
  • 用ArrayList來存放小球;
  • 生成了一個BallComponent對象;
  • 每一次start,addBall方法都會啟動一個新線程,即每個小球都是在自己的線程中繪制的。

1.3 選做:程序改寫:程序運行時,每個小球都是從固定位置出發。如何改寫該程序,使得當點擊start時,每個小球可以從不同位置出發、以不同的步進移動?
1.4 選做:不同小球的移動軌跡一模一樣。改造程序,使得每個小球運行軌跡不完全一樣,比如有的可以走余弦軌跡、有的可以走方波軌跡、有的走布朗運動、有的走五角星,等等

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

2.1 題目:Thread、PrintTask、Runnable與匿名內部類。
並回答:a)通過定義Runnable接口的實現類來實現多線程程序比通過繼承自Thread類實現多線程程序有何好處?b) 6-1,6-3,6-11實驗總結。
答:
通過定義Runnable接口的實現類來實現多線程程序的好處:
在這種方式下,線程類在實現了Runable接口的同時,還可以繼承其他的類。可以多個線程共享同一個目標對象,所以比通過繼承自Thread類更適合多個線程來處理同一份資源

  • 6-1
    本題采用extends Thread 來創建線程,首先是構造函數(傳參),然後就是對 run 方法的重寫了:這裏註意要把“使用System.out.println(Thread.currentThread().getName()+" "+isAlive())打印標識信息”放在循環體外邊。

  • 6-3
    本題要求用匿名類實現 run 方法的重寫,主線程名 用mainThreadName,線程t1的線程名:Thread.currentThread().getName()

  • 6-11
    除了實現Runnable接口外,其余與6-1一樣。

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

Thread t1 = new Thread(    ( ) -> {
            System.out.println(mainThreadName);
            System.out.println(Thread.currentThread().getName());
            System.out.println(Arrays.toString(Thread.class.getInterfaces()));
        }    );

2.3 題目:6-2(Runnable與停止線程)。回答:需要怎樣才能正確地停止一個運行中的線程?
答:
可以通過調用線程的stop()方法來終止線程,但可能會引發某些問題,不能保證線程的資源正確釋放,已被廢棄
如果要停止線程,應讓線程跑完應有流程,可采用boolean標誌來使線程中的run()方法退出

//線程自我終止
public void run(){
    while (flag){
        … //完成線程的特定功能
        if( time_to_die ){
              flag = false;
        }
    }
}

2.4 選做:6-8(CountDownLatch)實驗總結
2.5 選做:6-9(集合同步問題)實驗總結
2.6 選做:較難:6-10(Callable),並回答為什麽有Runnable了還需要Callable?實驗總結。

3. 互斥訪問

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

3.2 選做:進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)

4. 互斥訪問與同步訪問

完成題集6-4(互斥訪問)與6-5(同步訪問)
4.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什麽辦法可以使用synchronized實現互斥同步訪問,使用代碼說明(請出現相關代碼及學號)?
答:
還可以使用synchronized代碼塊;以6-4為例
技術分享圖片

4.2 同步代碼塊與同步方法有何區別?
答:
同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖,所以:同步方法鎖的範圍比較大,而同步代碼塊範圍要小點,一般同步的範圍越大,性能就越差,反之性能好。

4.3 實現互斥訪問的原理是什麽?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麽變化的?
答;
原理:用synchronized給共享資源上鎖,使之在同一時間只能有一個線程使用資源;
技術分享圖片

技術分享圖片

從運行結果來看,一個時間內只能有一個線程得到執行。當ta工作時,就相當於ta給for循環上栗一把鎖,tb必須等待ta執行完這個代碼塊以後才能執行該代碼塊。

4.4 Java多線程中使用什麽關鍵字實現線程之間的通信,進而實現線程的協同工作?
答:
synchronized 、wait、notify/notifyAll。

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

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

技術分享圖片

不正常,放入100個,取出100個,不可能還剩10個。原因是Producer與customer的執行速度不一樣,也就是存取貨物的順序每次運行時都會不一樣,就會出現差錯。

5.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)
答:
技術分享圖片

5.3 選做:使用Lock與Condition對象解決該問題。

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

6.1 系統的功能模塊表格,表格中體現出每個模塊的負責人。
6.2 運行視頻
6.3 講解自己負責的模塊,並粘貼自己負責模塊的關鍵代碼(出現學號及姓名)。

3.碼雲及PTA

題目集:多線程

3.1. 碼雲代碼提交記錄

  • 在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然後搜索並截圖
  • 必須出現幾個要素:提交日期-用戶名(姓名與學號)-不提交說明
    技術分享圖片

3.2 截圖"多線程"PTA提交列表
需要有兩張圖(1. 排名圖。2.PTA提交列表圖)
技術分享圖片

技術分享圖片

技術分享圖片

3.3 統計本周完成的代碼量
需要將每周的代碼統計情況融合到一張表中。

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 0 0 0 0
2 0 0 0 0
3 619 619 12 12
4 619 0 12 0
5 970 351 17 5
6 1118 148 25 8
7 1231 113 28 3
8 1707 476 33 5
9 1902 195 38 5
10 2316 414 43 5
11 2505 189 48 5
12 2885 380 54 6

201621123057 《Java程序設計》第11周學習總結