關于并發編程,不光是面試經常問到,在實際的操作程序中,也會經常用到,所以一來是為了加深自己的印象,二來也希望能和大家公共學習,不對的地方請斧正,謝謝!
1、程式、行程、執行緒的關聯和區別?
這是個老生常談的問題了,很多公司的筆試題都會考這個問題,下面來簡單分析下
程式:程式是什么,舉個例子,你經常玩的吃雞、LOL就是程式(含有指令與資料的檔案)
行程:先說概念,行程就是程式運行資源分配的最小單位,你雙擊運行程式,就會產生一個行程,
執行緒:概念:CPU調度的最小單位,存在于行程當中,你運行的游戲中就會有很多個執行緒,執行不同的作業,音樂、顯示等,
運用多執行緒的好處:充分的利用cpu資源,但是并不是任何時候多執行緒都比單執行緒更節約時間,背景關系切換也比較耗時,
JDK的執行緒是協作式,不是搶占式!!!
2、并發和并行?
并發:交替執行不同的任務
并行:同時執行不同的任務
就像告訴公路一樣,并發就是單車道,車輛需要排隊的跑,并行就是多車道,
這里需要注意一下,談論并發的時候一定要加上單位時間,否則的話將毫無意義,比如說,單位時間內的并發量是多少,
3、創建執行緒的幾種方式?
這也是個面試官經常問到的問題,兩種還是3種?
從代碼上看,其實有三種,Thread、Runnbale、Callable,
但是如果從官方檔案來講,就只有兩種,
There are two ways to create a new thread of execution.//這句話是Thread.class中73行所寫,官方承認只有兩種!
其中Thread是對執行緒的抽象,Runnable是對任務的抽象,并且,Thread類也是實作了Runnable介面,
4、執行緒的生命周期
新建狀態,就緒狀態,運行狀態,阻塞狀態,死亡狀態(5種)

執行緒中斷:
在之前的jdk版本中,中斷會有stop(),destory()等方法,但是執行緒不建議使用了,為什么?因為這些方法非常的暴力,呼叫后不會釋放執行緒所占有的資源!
在當前的JDK版本中,是使用interrupt()方法,但是這里并發強制性的,呼叫該方法之后,會讓執行緒自己進行中斷,而不是呼叫了馬上進行中斷,讓出資源,
在方法中,也不要使用true或者false來直接判斷當前執行緒是否中斷,因為run方法中有阻塞呼叫時,無法很快的檢測到取消標識,執行緒必須從阻塞呼叫后才會去檢查這個取消標識,
什么是阻塞方法:
1、sleep()方法,支持中斷檢查
注意:處于死鎖的執行緒無法被中斷
join():讓當前執行緒獲得CPU的執行權
yeild():讓當前執行緒讓出CPU執行權,進入就緒狀態,
wait():當前執行緒等待,并且釋放當前物件鎖(只有wait會釋放當前對應鎖)
notify():讓一個當前等待的執行緒變成就緒狀態
notifyAll():讓所有的執行緒變成就緒狀態
說到wait和notify就不得不說一下,等待通知范式:
什么是等待通知范式,等待(wait),通知(notify)
注意:等待和通知的呼叫都要放在鎖當中呼叫(都需要先獲得鎖)
例子:
synchronized(this){
wait();//notify()
}
這里推薦一個比較經典的筆試題:子彈上膛/射擊
這里說一下什么是守護執行緒
守護執行緒就是:用于后臺調度以及支持性功能,GC就是守護執行緒,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257187.html
標籤:其他
上一篇:csp 報數 C語言
