當程式中包含多個執行緒時,CPU 不是一直被特定的執行緒霸占,而是輪流執行各個執行緒,
那么,CPU 在輪換執行執行緒的程序中,即從創建到消亡的整個程序,可能會歷經 5 種狀態,分別是新建、就緒、運行、阻塞和死亡,

執行緒的新建狀態
無論是通過 Thread 類直接實體化物件創建執行緒,還是通過繼承自 Thread 類的子類實體化創建執行緒,新創建的執行緒在呼叫 start() 方法之前,不會得到執行,此階段的執行緒就處于新建狀態,
執行緒的就緒狀態
當位于新建狀態的執行緒呼叫 start() 方法后,該執行緒就轉換到就緒狀態,
所謂就緒,就是告訴 CPU,該執行緒已經可以執行了,但是具體什么時候執行,取決于 CPU 什么時候調度它,
換句話說,如果一個執行緒處于就緒狀態,只能說明此執行緒已經做好了準備,隨時等待 CPU 調度執行,并不是說執行了 start() 方法此執行緒就會立即被執行,
執行緒的運行狀態
當位于就緒狀態的執行緒得到了 CPU,并開始執行 target 引數執行的目標函式或者 run() 方法,就表明當前執行緒處于運行狀態,
但如果當前有多個執行緒處于就緒狀態(等待 CPU 調度)時,處于運行狀態的執行緒將無法一直霸占 CPU 資源,為了使其它執行緒也有執行的機會,CPU 會在一定時間內強制當前運行的執行緒讓出 CPU 資源,以供其他執行緒使用,
執行緒的阻塞狀態
當 CPU 對多個執行緒進行調度時,對于獲得 CPU 調度卻沒有執行完畢的執行緒,就會進入阻塞狀態,
目前幾乎所有的桌面和服務器作業系統,都采用的是搶占式優先級調度策略,即 CPU 會給每一個就緒執行緒一段固定時間來處理任務,當該時間用完后,系統就會阻止該執行緒繼續使用 CPU 資源,讓其他執行緒獲得執行的機會,
對于具體選擇那個執行緒上 CPU,不同的平臺采用不同的演算法,比如先進先出演算法(FIFO)、時間片輪轉演算法、優先級演算法等,每種演算法各有優缺點,適用于不同的場景,
除此之外,如果處于運行狀態的執行緒發生如下幾種情況,也將會由運行狀態轉到阻塞狀態:
- 執行緒呼叫了 sleep() 方法;
- 執行緒等待接收用戶輸入的資料;
- 執行緒試圖獲取某個物件的同步鎖時,如果該鎖被其他執行緒所持有,則當前執行緒進入阻塞狀態;
- 執行緒呼叫 wait() 方法,等待特定條件的滿足,
以上幾種情況都會導致執行緒阻塞,只有解決了執行緒遇到的問題之后,該執行緒才會由阻塞狀態轉到就緒狀態,繼續等待 CPU 調度,
以上 4 種可能發生執行緒阻塞的情況,解決措施分別如下:
- sleep() 方法規定的時間已過;
- 執行緒接收到了用戶輸入的資料;
- 其他執行緒釋放了該同步鎖,并由該執行緒獲得;
- 呼叫 set() 方法發出通知,
執行緒死亡狀態
對于獲得 CPU 調度卻未執行完畢的執行緒,它會轉入阻塞狀態,待條件成熟之后繼續轉入就緒狀態,重復爭取 CPU 資源,直到其執行結束,
執行結束的執行緒將處于死亡狀態,
執行緒執行結束,除了正常執行結束外,如果程式執行程序發生例外(Exception)或者錯誤(Error),執行緒也會進入死亡狀態,
對于處于死亡狀態的執行緒,有以下 2 點需要注意:
- 主執行緒死亡,并不意味著所有執行緒全部死亡,也就是說,主執行緒的死亡,不會影響子執行緒繼續執行;反之也是如此,
- 對于死亡的執行緒,無法再呼叫 start() 方法使其重新啟動,否則 Python 解釋器將拋出 RuntimeError 例外,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104955.html
標籤:Python
