一看就懂的線程狀態
線程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(禮讓線程):.net
- 定義在Thread類中
- 調用時讓出cpu執行權,讓有一樣優先級(大於等於)的正在等待的線程有機會執行。
- 誰能得到CPU資源取決於調度器,yield方法是不可靠的,它只能盡力而爲
PS:線程
- 狀態圖詳細版,來自本人蔘考許多資料後,花了幾個小時本身手工畫的,以爲有幫助的朋友們請點個贊,程序員畫圖畫的想哭!(想追求完美)
- 文章來自各類資源的整理,若有侵權請告知刪除。
- 轉載本文請註明出處
歡迎關注本站公眾號,獲取更多信息