一看就懂的線程狀態

線程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(禮讓線程):.net

    1. 定義在Thread類
    2. 調用時讓出cpu執行權,讓有一樣優先級(大於等於)的正在等待的線程有機會執行。
    3. 誰能得到CPU資源取決於調度器,yield方法是不可靠的,它只能盡力而爲

PS:線程

  1. 狀態圖詳細版,來自本人蔘考許多資料後,花了幾個小時本身手工畫的,以爲有幫助的朋友們請點個贊,程序員畫圖畫的想哭!(想追求完美)
  2. 文章來自各類資源的整理,若有侵權請告知刪除。
  3. 轉載本文請註明出處
相關文章
相關標籤/搜索