執行緒的狀態型別和相互轉換

2021-08-28 03:08:47 字數 1324 閱讀 9938

寫部落格的目的是為了自己學習和複習,許多解釋來自於網上大牛,文章非原創。能幫助到別人當然更好不過,水平有限,可能有許多錯誤,歡迎指正。

新建狀態(new):新建立了乙個執行緒物件

就緒狀態(runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權

執行狀態(running):就緒狀態的執行緒獲取了cpu,執行程式**

阻塞狀態(blocked):阻塞狀態是執行緒因為某種原因放棄cpu使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

(一)、等待阻塞:執行的執行緒執行wait()方法,jvm會把該執行緒放入等待池中

(二)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒占用,則jvm會把該執行緒放入鎖池中

(三)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了i/o請求時,jvm會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者i/o處理完畢時,執行緒重新轉入就緒狀態

死亡狀態(dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期

執行緒狀態圖:

這兩個方法來自不同的類,分別是:sleep()來自thread類,wait()來自object類。sleep()是thread的靜態類方法,誰呼叫的誰去睡覺,即使在a執行緒裡呼叫b的sleep方法,實際上還是a去睡覺, 要讓b執行緒睡覺要在b的**中呼叫sleep。

鎖: 最主要是sleep()方法沒有釋放鎖,而wait()方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。sleep()不出讓系統資源;wait()是進入執行緒等待池等待,出讓系統資源,其他執行緒可以占用cpu。一般wait()不會加時間限制,因為如果wait()執行緒的執行資源不夠,再出來也沒用,要等待其他執行緒呼叫notify/notifyall喚醒等待池中的所有執行緒,才會進入就緒佇列等待os分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能呼叫interrupt()強行打斷。thread.sleep(0)的作用是「觸發作業系統立刻重新進行一次cpu競爭」。使用範圍:wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用。

synchronized(x)

執行緒7種狀態的相互轉換

小小的作下解釋 1 執行緒的實現有兩種方式,一是繼承thread類,二是實現runnable介面,但不管怎樣,當我們new了這個物件後,執行緒就進入了初始狀態 2 當該物件呼叫了start 方法,就進入可執行狀態 3 進入可執行狀態後,當該物件被作業系統選中,獲得cpu時間片就會進入執行狀態 4 進...

執行緒7種狀態的相互轉換

今天有同事問到執行緒的問題,自己突然就有點蒙了,只模糊的記得個大概。當初學習執行緒的時候把這7個狀態記得比自己名字還熟悉 還把這7個狀態編成了一段悽慘而美麗的愛情故事 沒想到如今卻只能記得個大概 真驗證了 好記性不如爛筆頭 的真理 還是趕快回憶一下吧 先從開始 小小的作下解釋 1 執行緒的實現有兩種...

執行緒的狀態以及狀態之間的相互轉換

新建狀態 new 新建立了乙個執行緒物件。就緒狀態 runnable 執行緒物件建立後,其他執行緒呼叫了該物件的start 方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。執行狀態 running 就緒狀態的執行緒獲取了cpu,執行程式 阻塞狀態 blocked 阻塞狀...