查看本章節
查看作業目錄
需求說明:
多執行緒操作同一個實體變數的操作會引發多執行緒并發的安全問題,現有 3 個執行緒代表 3 只猴子,對類中的一個整型變數 count(代表花的總數,共 20 朵花)進行操作,該變數代表花的總數,不同猴子(執行緒)每采摘一次,花的總數少 1,直至所有花被不同的猴子采摘完,程式結束

實作思路:
- 專案中創建 Current 類,在 Current 類中,宣告靜態的 Current 型別參考 current 和 int 型別的實體變數 num,并指定 num 的初始值為 20,代表花的總數
- 定義采花 fetch() 方法,在方法中使用同步代碼塊對 current 物件進行加鎖,在同步代碼塊中,判斷 num 是否大于 0,如果大于 0,則輸出猴子采花的進度,并讓 num 自減
- 重寫 run() 方法,在該方法中創建 while 回圈,條件為 num 大于 0,回圈中呼叫 fetch(String name) 方法,通過呼叫 Thread.currentThread().getName() 方法獲取當前運行的執行緒名稱,并將該執行緒名稱賦值給引數 name
- 創建程式入口 main() 方法,在該方法中創建 3 條執行緒,并分別為這 3 條執行緒設定名稱為“猴子 A”“猴子 B”和“猴子 C”,依次呼叫 3 個執行緒物件的 start() 方法,啟動執行緒
實作代碼:
public class T1 implements Runnable {
// public static T1 t2 = new T1();
//設定鮮花的數量為20
int num = 20;
@Override
public void run() {
synchronized (new T1()) {
while (num>0) {
System.out.println("猴子"+Thread.currentThread().getName()+"\t菜花\t"+num--);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
T1 t1=new T1();
Thread thread = new Thread(t1);
Thread thread1 = new Thread(t1);
thread1.setName("B");
thread.setName("A");
thread.start();
thread1.start();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/136501.html
標籤:其他
