一看就懂的執行緒狀態
阿新 • • 發佈:2019-12-31
執行緒6大狀態(個人理解)
- NEW(新建狀態):新建一個執行緒
- RUNNABLE(可執行態):獲得了鎖,獲得了時間片,正在執行。
- BLOCKED(阻塞狀態):未獲得鎖,在此等候獲得鎖。
- WAITING(無限等待狀態):wait()沒有被主動喚醒,t.join() 執行緒t沒有執行完畢。
- TIMED_WAITING(有限等待狀態):wait(時間)、sleep(時間)、t.join(時間),當時間還沒結束。
- TERMINATED(終止狀態):執行緒結束
狀態圖解析
- 圖中左下角的6大狀態是API檔案中介紹的,比較官方。
- 我畫得圖中多了一個不存在Running狀態,是為了好理解
- wait()方法執行時,會釋放鎖資源,導致其被喚醒後或時間到期後,直接進入阻塞狀態,去請求鎖資源。
- sleep()和join()執行時,不會釋放鎖資源,所以方法結束後,直接進入runnable狀態。
狀態圖簡單版
狀態圖簡單版摘自https://my.oschina.net/ericquan8/blog/384655
Join方法簡介
- 執行緒合併:將兩個交替執行的執行緒合併為順序執行的執行緒,即讓非同步執行的執行緒變成同步執行的執行緒
- t.join():方法阻塞呼叫此方法的執行緒,直到執行緒t完成,此執行緒再繼續
- t.join(1000):等待 t 執行緒,等待時間是1000毫秒
wait、sleep和yield方法的區別
-
wait:
- 定義在Object類中,是一個例項方法
- 只能在同步(synchronize)環境中被呼叫,可被notify和notyfyAll執行緒喚醒
- 等待時會釋放鎖,喚醒後進入阻塞狀態
- 被用於執行緒間通訊
- wait、notify、notifyAll無需捕獲異常
-
sleep:
- 定義在Thread類中,是一個靜態方法
- 等待時持有鎖,可設定睡眠時間,喚醒後進入就緒狀態
- 被用於短時間暫停當前執行緒
- 必須捕獲異常
-
yield(禮讓執行緒):
- 定義在Thread類中
- 呼叫時讓出cpu執行權,讓有同樣優先順序(大於等於)的正在等待的執行緒有機會執行。
- 誰能獲得CPU資源取決於排程器,yield方法是不可靠的,它只能盡力而為
PS:
- 狀態圖詳細版,來自本人蔘考許多資料後,花了幾個小時自己手工畫的,覺得有幫助的朋友們請點個贊,程式設計師畫圖畫的想哭!(想追求完美)
- 文章來自各種資源的整理,如有侵權請告知刪除。
- 轉載本文請註明出處