你以前看的執行緒狀態轉換圖可能都是錯的-圖解併發程式設計第二篇

語言: CN / TW / HK


本文作為圖解java併發程式設計的第二篇,前一篇訪問地址如下所示:

圖形說明

在開始想寫這篇文章之前,我去網上搜索了很多關於執行緒狀態轉換的圖,我驚訝的發現:超過80%的圖都是不完整的,或者是錯的。所以我只好再次去閱讀原始碼,然後畫出下面的這張圖,理解了這張圖,對於大家理解java 執行緒的方法呼叫及開發過程會有很大的幫助。

  • 同步阻塞狀態比較好理解,就是互斥鎖,當前執行緒使用到的程式碼塊,只有我用完了你才能用。
  • 延時等待狀態與等待狀態的主要區別在於
    • 延時等待狀態不會釋放任何資源及監視器。我就是佔著茅坑不拉屎,也不給你用。我就是休息一會,我休息完了,我的還是我的。
    • 等待阻塞狀態會暫時釋放相關執行緒資源及監視器,我的資源暫時借給你用,等我notify找你的時候你要將資源還給我

Thread.State原始碼註釋

public enum State {
    /**
     *  新生狀態:執行緒物件建立,但是還未start()
     */
    NEW,

    /**
     * 執行緒處於可執行狀態,但是這個可執行狀態並不代表執行緒一定在虛擬機器中執行。
     * 需要等待從作業系統獲取到資源(比如處理器時間片),才能真正的去執行
     */
    RUNNABLE,

    /**
     * 當前執行緒處於阻塞狀態,正在等待另一個執行緒的monitor lock釋放,才進入synchronized程式碼塊或方法
     */
    BLOCKED,

    /**
     * 呼叫Object.wait() 、 Thread.join方法後當前執行緒處於等待狀態,
     * 等待其他的執行緒執行特定的動作,才能從等待狀態退出。
     * 比如:Object.wait()的執行緒需要等待其他執行緒呼叫Object.notify()、Object.notifyAll()才能退出
     * 比如:呼叫了Thread.join()的執行緒需要等待指定的執行緒執行完成才能退出等待狀態。
     */
    WAITING,

    /**
     * 進入特定時間內的等待狀態,等待一段指定的時間sleep(timed)、wait(timed)或者等待Thread.join(timed)的時間.
     * 到達指定時間點自動退出恢復到RUNNABLE狀態
     */
    TIMED_WAITING,

    /**
      * 執行緒結束狀態
     */
    TERMINATED;
}


本文分享自微信公眾號 - 字母哥課堂(zimug_blog)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。