用多執行緒來解決多人分零食問題

2021-10-08 17:09:22 字數 1550 閱讀 3744

x# 用多執行緒來解決多人分零食問題

執行緒的建立和啟動有兩種方式:1,繼承於執行緒類thread來建立執行緒2,利用實現於runnable的方式建立執行緒

用法:先自定乙個類,然後繼承於thread類,在自定義類中要覆蓋thread類中的run()方法,run()方法中寫自己需要開啟執行緒的**,之後在主方法中建立自定義類的物件,呼叫物件中繼承父類的start方法,底層會自動呼叫自定義類中的run方法,開啟執行緒.不能直接呼叫run方法,因為這樣只是執行乙個普通方法,不會開啟多個執行緒.

具體**:

public void run()}

public class threaddemo

}用法:先建立乙個自定義類,讓它實現於runnable介面,類中定義乙個覆蓋的run方法,用於寫自己執行緒的具體**,在主方法中建立乙個自定義類物件,然後再建立乙個thread類物件,將自定義物件引入thread類的有參構造器中,只需呼叫thread物件的start方法就可以開啟自定義類的執行緒了.

具體**;

public void run()

}public class runnabledemo

}當擁有多執行緒的時候,我們會發現乙個問題:繼承方式建立多執行緒時會建立多個物件,當面對多執行緒共享同乙個資源的問題時,建立多個物件意味著有多個資源,例如三個人一起分50包零食時,用繼承方式會建立150包零食,這樣就沒有達到自己想要的目的(除了把成員變數用static修飾),而用實現方式可以建立三個執行緒同時引用乙個物件來進行操作,從這方面來看實現方式比繼承方式更能體現出多執行緒.

具體**

繼承方式來完成三個人分零食

public class threaddemo

}class food extends thread

public void run()

}}

實現方式來完成三個人分零食
public class runnabledemo

}class food implements runnable

} }}

當我們使用多執行緒併發訪問同乙個資源物件時,可能會出現執行緒不安全的問題,因為乙個執行緒進入資源的同時其他執行緒也可以進入,這樣就容易出問題.例如:我們使用thread類中的sleep方法使執行緒休眠來模仿網路延遲,休眠時間越長問題就會越明顯,當乙個執行緒訪問乙個資源時進入休眠狀態,其他執行緒這時也在訪問這個資源,就會產生兩個執行緒最後操作的結果相同問題;

解決方案

我們發現多個執行緒同時操作乙個資源時會產生問題,所以有些操作在被乙個執行緒訪問時其他執行緒不能進入,當多執行緒進行搶占資源時,哪個執行緒最先進入資源就立刻鎖住不讓其他執行緒進入,這樣就不會出現安全問題.

解決方式1:同步**塊

語法:synchronized(需要同步監聽的物件)

此時同步鎖就是()中的物件

解決方式2:同步方法

只要是使用synchronized修飾的方法都叫做同步方法

我們一般會把需要同步操作的**都新建在乙個方法中,使用synchronized修飾

誰呼叫同步方法誰就是同步鎖;非static方法同步鎖就是呼叫方法的物件,static方法同步鎖就是當前方法所在類的位元組碼物件.

這樣來理解多執行緒

每乙個程式可以包含至少乙個執行緒,而多個執行緒之間可以 併發 執行。在介紹執行緒前先來用生活中最常見的乙個小例子來理解什麼是執行緒 假如你去一家餐館吃飯,那家餐館只有乙個服務員,所以這個唯一的服務員給你點菜的時候,別的去餐館吃飯的人就得等著。但是如果這個餐館有多個服務員的話,那麼在同一時刻就可以給多...

多執行緒學習 三 執行緒案例 多人搶票

案例說明 名稱 多人搶票 說明 多個執行緒同時操作同乙個物件 發現問題 當多個人操作同乙個物件時,會出現資料紊亂 案例 2020 4 5 17 44 檔案說明 多個執行緒同時操作同乙個物件 多人搶票例子 發現問題 當多個人操作同乙個物件時,會出現資料紊亂 author 太陽以西 夢可以到的地方,只要...

模擬多人售票的多執行緒測試

01classlockdemocatch exception e 06 07tt.lockname vip clinet1 saler b was late for work,but 08 later is better than never 09newthread tt start 10 11 1...