關於多執行緒的處理,如果是接觸的少,實際的開發中也使用的少的話,感覺總是那麼抽象
今天參加了公司的多執行緒培訓後才恍然
如何建立執行緒相信大家都知道,通過繼承 thread 或者是想 runnable介面
xx.start();乙個執行緒就啟動了
但是多執行緒我們更多的是要需要考慮,死鎖,資源共享,執行緒通訊的問題
1、死鎖,避免執行緒的互斥情況,避免資源等待的情況
2、資源共享,通過加鎖來控制
3、執行緒間的通訊,通過控制資源,定義公共的資料區域,wait,notify,interrupt來處理。
對應執行緒的生命週期,可能我們都很少關注如何去停止乙個執行緒,這裡說幾種處理
a、直接呼叫stop()方法,這個是不被推薦的,因為它是直接強制停止執行緒操作,而不會考慮當前執行緒的處理狀態,有時候當執行緒正在做一些非常重要的處理時,這樣直接停止是非常危險的事情。
b、程式直接跑完,其實只要run方法中的**跑完了,我們的執行緒生命週期也就是完了
c、通過現場自帶的方法:xx.interrupt();
通過這種方式來結束執行緒就可以保持執行緒當前的執行狀態,安全的結束,但是這樣操作也會有一種情況,如果執行緒是出於阻塞狀態,例如xx.sleep(100000);呼叫interrupt則會跑出執行不成功的一樣,需要在run方法中將這個異常try住,在catch中處理結束執行緒的操作。
資源加鎖synchronized分**塊和方法。
意義都差不多,只是需要根據自己的程式來進行控制,目的都是為了控制只有乙個執行緒在執行目標**
但是還有乙個需要注意的是加鎖的級別是物件級還是類級別, 通過 static來進行控制。
wait和notifyall的使用:
等待還有乙個thread.sleep方法,和wait的區別就是wait會釋放資源等待,如果沒有notify來喚醒的話,執行緒將一直等待下去。
使用wait和notify需要注意的是,要確保notity在wait的後面執行,否則notity將不起作用,不過一般都是用notifyall直接喚醒所有。
mythread.class.notifyall()
mythread.class.wait();
運用多執行緒執行操作的時候,有時候我們可能要彙總所有執行緒最後的執行結果,也就需要等待最後乙個執行緒執行完
雖然可以加wait或者其他資源標誌位來判斷,但在這樣處理還是比較麻煩,我們知道裡面的原理就ok了
這裡推薦乙個多執行緒的框架
executor
對多執行緒框架做了很好的控制,有需要的鞋童可以到網上找了看看,這裡不做詳細介紹了
多執行緒的那點兒事(之多執行緒除錯)
軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。include int value 0 void test int main 1 資料斷點 所謂資料斷點,就是全域性變數或者函式中的數...
多執行緒的那點兒事(之多執行緒除錯)
軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。include int value 0 void test int main 1 資料斷點 所謂資料斷點,就是全域性變數或者函式中的數...
多執行緒的那點兒事(之多執行緒除錯)
軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。cpp view plain copy include intvalue 0 void test intmain 1 資料斷點 所謂資...