1. 程式人生 > 程式設計 >一看就懂的執行緒狀態

一看就懂的執行緒狀態

執行緒6大狀態(個人理解)

  1. NEW(新建狀態):新建一個執行緒
  2. RUNNABLE(可執行態):獲得了鎖,獲得了時間片,正在執行。
  3. BLOCKED(阻塞狀態):未獲得鎖,在此等候獲得鎖。
  4. WAITING(無限等待狀態):wait()沒有被主動喚醒,t.join() 執行緒t沒有執行完畢。
  5. TIMED_WAITING(有限等待狀態):wait(時間)、sleep(時間)、t.join(時間),當時間還沒結束。
  6. TERMINATED(終止狀態):執行緒結束

狀態圖解析

  1. 圖中左下角的6大狀態是API檔案中介紹的,比較官方。
  2. 我畫得圖中多了一個不存在Running狀態,是為了好理解
  3. wait()方法執行時,會釋放鎖資源,導致其被喚醒後或時間到期後,直接進入阻塞狀態,去請求鎖資源。
  4. sleep()和join()執行時,不會釋放鎖資源,所以方法結束後,直接進入runnable狀態。

狀態圖簡單版

狀態圖簡單版摘自https://my.oschina.net/ericquan8/blog/384655

Join方法簡介

  1. 執行緒合併:將兩個交替執行的執行緒合併為順序執行的執行緒,即讓非同步執行的執行緒變成同步執行的執行緒
  2. t.join():方法阻塞呼叫此方法的執行緒,直到執行緒t完成,此執行緒再繼續
  3. t.join(1000):等待 t 執行緒,等待時間是1000毫秒

wait、sleep和yield方法的區別

  • wait:

    1. 定義在Object類中,是一個例項方法
    2. 只能在同步(synchronize)環境中被呼叫,可被notify和notyfyAll執行緒喚醒
    3. 等待時會釋放鎖,喚醒後進入阻塞狀態
    4. 被用於執行緒間通訊
    5. wait、notify、notifyAll無需捕獲異常
  • sleep:

    1. 定義在Thread類中,是一個靜態方法
    2. 等待時持有鎖,可設定睡眠時間,喚醒後進入就緒狀態
    3. 被用於短時間暫停當前執行緒
    4. 必須捕獲異常
  • yield(禮讓執行緒):

    1. 定義在Thread類
    2. 呼叫時讓出cpu執行權,讓有同樣優先順序(大於等於)的正在等待的執行緒有機會執行。
    3. 誰能獲得CPU資源取決於排程器,yield方法是不可靠的,它只能盡力而為

PS:

  1. 狀態圖詳細版,來自本人蔘考許多資料後,花了幾個小時自己手工畫的,覺得有幫助的朋友們請點個贊,程式設計師畫圖畫的想哭!(想追求完美)
  2. 文章來自各種資源的整理,如有侵權請告知刪除。
  3. 轉載本文請註明出處