標籤:blog not 指定 boolean his 繪製 為什麼 list 代碼塊
一. 本周學習總結
1.1 以你喜歡的方式(思維導圖或其他)歸納總結多線程相關內容。
二. 書面作業
本次PTA作業題集多線程
1. 原始碼閱讀:多線程程式
BounceThread1.1
BallRunnable類有什麼用?為什麼代碼中需要調用
Thread.sleep進行休眠?
答:BallRunnable類是支援多線程的類,開啟了一個程式,使小球按照指定的規則移動,然後畫出來獲得小球的形狀。代碼中調用Thread.sleep進行休眠是為了延緩線程完成的時間,這樣我們才能看到小球的移動,不然太快了看不到小球的移動軌跡。
1.2題:a)
Ball.java只做了兩件事,這兩件事分別是什嗎?
答:move()方法,實現小球的移動; getShape()方法,擷取小球的座標和大小。
b)
BallComponent對象是幹什麼的?
答:添加小球;畫出小球。
c)其內部的ArrayList有什麼用?
答:用於存放添加的小球。
d)程式運行過程中,產生了幾個BallComponent對象?
答:只有1個。
e)該程式使用了多線程技術,每個小球是分別在不同的線程中進行繪製嗎?
答:是。每按一次start按鈕,addBall方法都會啟動一個新線程。
2. 實驗總結:題集(多線程)2.1 題目:Thread、PrintTask、Runnable與匿名內部類。並回答:a)通過定義
Runnable介面的實作類別來實現多線程程式比通過繼承自
Thread類實現多線程程式有何好處?
答:Java中不支援多繼承,只能繼承一個父類,但可以繼承多個介面,所以使用實現介面的方法可以避免繼承的局限。使用Runnable實現多線程使多個線程一起完成多個任務。
b) 6-1,6-3,6-11實驗總結。
- 6-1: 在構造該線程的時候,將要迴圈的次數num傳入。然後重寫run()方法。最後使用
System.out.println(Thread.currentThread().getName()+" "+isAlive())列印標識資訊。
- 6-3:在Main方法中啟動一個線程t1,該線程列印3行資訊: 主線程名;線程t1的線程名 ;線程t1所實現的所有介面,使用
System.out.println(Arrays.toString(getClass().getInterfaces()));列印。
- 6-11:這題主要是編寫
PrintTask類實現Runnable介面,功能主要是輸出從0到n-1的整數(n在建立PrintTask對象的時候初始化)。並在最後使用System.out.println(Thread.currentThread().getName());輸出標識資訊。
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與停止線程)。回答:需要怎樣才能正確地停止一個運行中的線程?
- 6-2:這題的重點主要是run()方法的內容。對每個傳入的word只檢查一遍(檢查完後將word置為null)。跳出無限迴圈後,使用
System.out.println(Thread.currentThread().getName() + " stop")列印標識資訊。
- 答:一般使用一個boolean類型的變數用來終止線程。使用while語句,在運行中通過改變boolean標記值,退出迴圈以達到停止線程的作用。
3. 互斥訪問3.1 修改
TestUnSynchronizedThread.java原始碼使其可以同步訪問。(關鍵代碼,需出現學號)
如下:
4. 互斥訪問與同步訪問
完成題集6-4(互斥訪問)與6-5(同步訪問)
4.1 除了使用
synchronized修飾方法實現互斥同步訪問,還有什麼辦法可以使用
synchronized實現互斥同步訪問,使用代碼說明(請出現相關代碼及學號)?
可以使用synchronized代碼塊:
public static void addId() {//黃子穎 201621123045synchronized (Counter.class) {//代表Counter類型的對象 id++;}}
使用顯式的Lock和Condition對象:
class Account {//黃子穎 201621123045private int balance;public Account(int balance) { super(); this.balance = balance;}public int getBalance() { return balance;}public void deposit(int money) { lock.lock(); try { balance += money; condition.signalAll(); } finally { // TODO: handle finally clause lock.unlock(); }}public void withdraw(int money) { lock.lock(); try { while (balance < money) { try { condition.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } balance -= money; } finally { // TODO: handle finally clause lock.unlock(); }}private java.util.concurrent.locks.Lock lock = new java.util.concurrent.locks.ReentrantLock();private java.util.concurrent.locks.Condition condition = lock.newCondition();}
4.2 同步代碼塊與同步方法有何區別?
- 同步方法直接在方法上使用
synchronized修飾,實現加鎖;而同步代碼塊在內部使用synchronized代碼塊。
- 同步代碼塊的效能更好些,但是同步方法的範圍比較大。
4.3 實現互斥訪問的原理是什嗎?請使用對象鎖概念並結合相應的代碼塊進行說明。當程式執行
synchronized同步代碼塊或者同步方法時,線程的狀態是怎麼變化的?
答:原理是當資源被一個任務使用時,其上加鎖。現在在訪問某項資源的任務必須鎖定這種資源,這時其他任務無法訪問它。其被解鎖時,另一個任務可以鎖定並且使用該資源了。例如:在下面的程式碼片段中,可以獲得對象“this”上的內部鎖。當執行程式時,如果不能獲得相對應的對象鎖,那麼將不能執行上述代碼塊中的內容,即synchronized同步代碼塊中的i++語句,就必須等待,等待獲得對象鎖。從而通過對象鎖實現了互斥訪問。
class MyCounter{ private int i = 0; public void increment(){ //i++; synchronized (this) { i++; } } ……}
線程的狀態的變化為:如果沒有獲得對象鎖就進入Look Pool狀態,等待同步鎖被釋放;同步鎖釋放後,線程進入Runnable狀態。
4.4 Java多線程中使用什麼關鍵字實現線程之間的通訊,進而實現線程的協同工作?
答:Java多線程中使用wait()和notify()/notifyAll()方法來實現線程之間的通訊,進而實現線程的協同工作的。
5. 線程間的合作:生產者消費者問題5.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,並回答:結果正常嗎?哪裡不正常?為什嗎?
運行結果如下:
答:結果可能會不正常,剩餘貨物可能不為0,可能是其他的數量。因為生產者與消費者的存取速度不一致,可能出現了沒有庫存還在取貨物的情況。
5.2 使用synchronized, wait, notify解決該問題(關鍵代碼,需出現學號)
如下:
6. 物件導向設計作業-圖書館管理系統6.1 系統的功能模組表格,表格中體現出每個模組的負責人。6.2 運行視頻6.3 講解自己負責的模組,並粘貼自己負責模組的關鍵代碼(出現學號及姓名)。三.碼雲及PTA
題目集:多線程
3.1. 碼雲代碼提交記錄
在碼雲的項目中,依次選擇“統計-Commits曆史-設定時間段”, 然後搜尋並
必須出現幾個要素:提交日期-使用者名稱(姓名與學號)-不提交說明
3.2 "多線程"PTA提交列表
需要有兩張圖(1. 排名圖。2.PTA提交列表圖)
3.3 統計本周完成的代碼量
需要將每周的代碼統計情況融合到一張表中。
| 周次 |
行數 |
新增行數 |
檔案數 |
新增檔案數 |
| 1 |
115 |
115 |
17 |
17 |
| 2 |
421 |
306 |
24 |
7 |
| 3 |
698 |
277 |
30 |
6 |
| 5 |
1085 |
387 |
38 |
8 |
| 6 |
1497 |
412 |
48 |
10 |
| 7 |
2033 |
536 |
57 |
9 |
| 8 |
2265 |
232 |
60 |
3 |
| 9 |
2728 |
522 |
65 |
5 |
| 10 |
3360 |
632 |
73 |
8 |
| 11 |
3958 |
598 |
83 |
10 |
| 12 |
4435 |
477 |
90 |
7 |
java第11次作業