1. 程式人生 > >201621123042《java程序設計》第十一次作業

201621123042《java程序設計》第十一次作業

forkjoin get 結束 lambda表達式 3.2 net 交流 作業 所有

1. 本周學習總結

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

技術分享圖片

2. 書面作業

本次PTA作業題集多線程

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

1.1 BallRunnable類有什麽用?為什麽代碼中需要調用Thread.sleep進行休眠?
答:BallRunnable類,實現了Runnable接口,實現run方法中的move和repaint方法,實現小球的軌跡。
調用Thread.sleep是為了使線程休眠,延緩線程的完成時間,這樣就可以查看小球的移動軌跡,如果不調用Thread.sleep方法的話那麽小球就會在很短的時間內結束運動軌跡,無法查看其狀態。

1.2 Ball.java只做了兩件事,這兩件事分別是什麽?BallComponent對象是幹什麽的?其內部的ArrayList有什麽用?程序運行過程中,生成了幾個BallComponent對象?該程序使用了多線程技術,每個小球是分別在不同的線程中進行繪制嗎?
答:
Ball.java做了兩件事move()方法實現小球移動,getShape()獲得小球的大小坐標。

BallComponent對象是實現了添加小球,和畫一個小球。

添加一個小球,就會啟動一個新的線程,所以每個小球都是在自己的線程中繪制的。

1.3選做:程序改寫:程序運行時,每個小球都是從固定位置出發。如何改寫該程序,使得當點擊start時,每個小球可以從不同位置出發、以不同的步進移動?

1.4選做:不同小球的移動軌跡一模一樣。改造程序,使得每個小球運行軌跡不完全一樣,比如有的可以走余弦軌跡、有的可以走方波軌跡、有的走布朗運動、有的走五角星,等等。

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

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

並回答:a)通過定義Runnable接口的實現類來實現多線程程序比通過繼承自Thread類實現多線程程序有何好處?b) 6-1,6-3,6-11實驗總結。
答:
好處:一個類只能繼承一個父類,但是可以實現多個接口。而且Running接口適合資源共享。

6-1實驗總結:這道題需要把num傳入,重寫run方法,最後打印標識符。

6-3實驗總結:這題需要在Main方法中啟動線程t1,打印三行信息。
mainThreadName
Thread.currentThread().getName()
Arrays.toString(getClass().getInterfaces()
分別打印主線程名,線程t1的線程名,及t1實現的所有接口。

6-11實驗總結:這題是PrintTask類實現Runnable接口,在run方法中輸出0-n-1的整數。

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

技術分享圖片

2.3 題目:6-2(Runnable與停止線程)。回答:需要怎樣才能正確地停止一個運行中的線程?
答:這題告訴我們停止一個線程不能使用stop方法,因為如果使用此方法線程在執行到一半的時候強行終止,所以當我們需要停止一個線程時一般使用一個boolean類型的變量來終止,在while(!flag)語句中通過改變boolean的值來使while退出循環從而終止線程。

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

3. 互斥訪問

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

技術分享圖片

3.2 選做:進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)
參考資料:Java多線程之Executor、ExecutorService、Executors、Callable、Future與FutureTask

4. 互斥訪問與同步訪問

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

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

4.2 同步代碼塊與同步方法有何區別?
答:同步代碼塊不是在方法名前面聲明synchronized,而是在要共享的代碼塊前面聲明synchronized。

4.3 實現互斥訪問的原理是什麽?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麽變化的?
答:當一個線程工作時,阻止另一個線程工作。
技術分享圖片
線程的狀態變化:
當程序執行synchronized同步代碼塊時,首先要獲得對象的內部鎖,如果沒有獲得,則進入Wait Pool,等到內部鎖被釋放時再進入lock pool 再運行,如果一開始就獲得內部鎖則直接進入lock pool,再運行。

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

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

5.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,並回答:結果正常嗎?哪裏不正常?為什麽?
答:這是因為Producer和customer的存取速度不一樣,兩者不能進行交流,導致貨物數量出現異常。

技術分享圖片

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

技術分享圖片

技術分享圖片

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

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

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

6.2 運行視頻

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

7. 選做:使用其他方法解決題目5的生產者消費者問題。

7.1 使用BlockingQueue解決生產者消費者問題關鍵代碼截圖
7.2 說明為什麽不需要顯示的使用wait、notify就可以解決同步問題。這樣解決相比較wait、notify有什麽優點嗎?
7.3 使用Condition解決生產者、消費者問題。

8. 選做:編寫一段代碼,證明你會使用ForkJoinPool.

9. 選做:單元測試JUint4

實驗任務書中的題目6:單元測試使用JUnit4
使用JUnit4對兩個排序算法的排序時間進行比較,並截圖。

3.碼雲及PTA

題目集:多線程

3.1. 碼雲代碼提交記錄

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

技術分享圖片

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

需要有兩張圖(1. 排名圖。2.PTA提交列表圖)

技術分享圖片

技術分享圖片

3.3 統計本周完成的代碼量

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

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 44 44 2 2
2 213 213 10 5
3 417 204 10 5
5 676 259 17 7
6 1071 405 24 7
7 1780 709 30 6
8 1900 120 35 5
9 2335 435 41 6
10 2767 432 48 7
11 3321 595 57 9
12 3601 280 63 6

4. 選做:課外閱讀

4.1

Java Concurrent Animated
4.2

線程的高級知識筆記
4.3

Questions and Exercises: Concurrency,學習總結。
4.4

Java多線程之Executor、ExecutorService、Executors、Callable、Future與FutureTask
4.5

線程池,這一篇或許就夠了
4.6

Java 8 Concurrency Tutorial: Threads and Executors

5. 選做:學會使用Eclipse進行調試

觀看相關調試視頻
5.1 簡述使用Eclipse進行調試需要幾步?調試時F5, F6, F7快鍵鍵各有什麽不同?什麽情況該使用哪個快捷鍵?
5.2 實驗任務書中的題目5:使用Eclipse進行調試中的5.1,如何使用Eclipse的調試功能發現當讀取“藍山蘭”這行不會出錯的原因?
5.3 任務書5.2,截圖證明你會使用條件斷點。
5.4 選做:調試MessageBoard.zip中的系統直至可以正常運行。說明你是怎麽找到該系統中的錯誤?使用到了什麽調試技巧?
參考資料:Eclipse 的一些調試技巧

201621123042《java程序設計》第十一次作業