關於多執行緒相關問題總結一下
阿新 • • 發佈:2018-11-14
程序和執行緒、多執行緒
- 程序是程式執行的基本單位,執行緒是程序中的基本單位;
- 執行緒共享一塊記憶體和系統資源,執行緒之間切換開銷相對程序較小;執行緒也被稱為輕量級程序;
- 各程序之間是獨立的,各執行緒之間則不是,程序之間屬於作業系統範疇
- 多執行緒其實是幾乎同時執行幾個執行緒;可以將執行時間長的放在後臺處理,增加程式執行速度
多執行緒的使用
- 繼承thread類
- 實現runnable介面(推薦)
一個簡單的死鎖
有兩個鎖lock1,lock2;
程式碼塊a先獲得Lock1,裡面巢狀競爭lock2,;
程式碼塊b獲得lock2,裡面巢狀著競爭鎖lock1;
此時兩個鎖均被獲得,
而程式碼塊兒中,又在等待兩個鎖的釋放,此時產生死鎖。
執行緒的生命週期
一些基本方法wait/notify/sleep/yield/join
https://blog.csdn.net/weixin_38719347/article/details/81219514
3.c
- sleep是不釋放鎖的,而wait則會釋放鎖,又由於wait是一定在sychronized程式碼塊裡面,所以他的目的就是就鎖釋放後,以便等待此鎖的其他執行緒可以競爭此鎖
- 結合上圖,鎖池其實就是在等待競爭得到鎖的一個池子。當notify之後,就會進入該池子。但是此時也不一定可以獲得鎖,因為可能sychronized程式碼塊還未執行完,鎖還未釋放。
- 對於sleep和wait的用法,最常見的就是生產者和消費者模式
linkedlist list = new linkedlist();
produce(){
sychronized(list){
while(){//倉庫不足的條件
list.wait();//倉庫不足,進入等待佇列,等待消費後喚醒
}
for(){
list.add();//生產商品
}
list.notifayall();
}
}
consume(){
sychronized(list){
while(){//產品不夠的條件
list .wait();//不夠消費,進入等待,等著生產後喚醒
}
for(){
list.remove();
}
list.notifyall()
}
}
- yield 交出cpu,回到可執行狀態,但是cpu交給誰由jvm排程決定
- join,等待執行緒銷燬,通常用在某一執行緒需要等待另一執行緒的計算結果的情況
main(){
for(int i=0; i<10; i++){
if(i==5){
thread t = new thread("");
t.start();
t.join();
}
}
}
此時,main執行緒,就需要等待t執行緒執行完銷燬之後,才繼續for 迴圈