線程生命週期總結

多線程是好多編程語言中的一個重要組成部分,尤其在Java編程中更加重要,可以充分利用計算機的資源,以處理更多任務。下面將介紹線程的基礎知識,即:線程的生命週期,已經生命週期中各個節點狀態的相互轉變。

1.組成線程生命週期的五個主要階段

NEW(線程創建狀態)
RUNNABLE(線程就緒狀態)
RUNNING(線程運行狀態)
BLOCKED(線程阻塞狀態)
TERMINATED(線程死亡狀態)

2.每個狀態和其他狀態的轉變

  • 2.1 線程的NEW狀態

當使用new關鍵字來創建一個線程對象時,在沒有調用該對象的start方法之前,該線程並沒有處於執行狀態,因爲線程沒有啓動,壓根兒就不存在。和創建一個其他普通對象一樣,只有通過調用start方法才能使線程進入到RUNNABLE狀態。

  • 2.2 線程的RUNNABLE狀態

只有調用線程對象的start方法之後,線程纔會進入到該狀態。但是進入到該狀態的線程並不會立刻去執行。必須等到CPU調度,得到CPU分配的時間片之後,纔可以執行,進入到RUNNING狀態。所以在調用start方法之後,進入RUNNING之前的這段時間,線程狀態爲RUNNABLE狀態,即:可執行狀態。該狀態下只能進入到RUNNING狀態或者意外終止,不能進入到BLOCKED狀態或者TERMINATED狀態。

  • 2.3 線程的RUNNING狀態

當處於RUNNABLE狀態的線程得到CPU分配的時間片之後,纔可以真正去執行線程內部的處理邏輯,處於RUNNING狀態的線程,本身也是RUNNABLE的,但是處於RUNNABLE狀態的線程不能也是RUNNING的。處於該狀態下的線程,通過CPU調度或者中斷等操作可以發生以下的狀態轉變:
(1) 調用線程的stop方法進入到TERMINATED狀態
(2) 調用線程的sleep方法或者wait方法進入到BLOCKED狀態
(3) 執行帶阻塞的IO操作,進入到BLOCKED狀態
(4) 進行鎖競爭,進入到鎖等待隊列中,處於BLOCKED狀態
(5) 由於受到CPU的調度,將時間片分配給了其他線程,則會進入到RUNNABLE狀態
(6) 線程本身調用了yield方法,將CPU執行權放棄,進入到RUNNABLE狀態

  • 2.4 線程的BLOCKED狀態

線程由於鎖競爭,IO阻塞,CPU調度或者其他原因進入到了BLOCKED狀態之後,可以再次切換到以下幾種狀態:
(1) 調用stop()方法或者由於JVM意外崩潰而直接進入到TERMINATED狀態
(2) 阻塞狀態結束,比如IO操作完成之後,會再次進入到RUNNABLE狀態
(3) 調用sleep之後,過了一段時間,休眠完成,會重新進入到RUNNALBE狀態
(4) 調用wait方法之後,由於其他線程使用了notify或者notifyAll,將線程喚醒,此時會進入到RUNNABLE狀態
(5) 鎖競爭中,等待一段時間之後獲取到了鎖資源,進入到RUNNABLE狀態

  • 2.5 線程的TERMINATED狀態

如果線程進入到了TERMINATED狀態之後,將沒有機會再次進入到其他狀態。因爲該狀態爲線程生命週期中的最後一個狀態,下面的幾種情況將會使線程進入到TERMINATED狀態:
(1) 線程生命週期正常結束,也就是線程中的執行邏輯正常結束
(2) 線程運行時出現異常意外結束
(3) JVM進程崩潰,會導致線程直接進入到TERMINATED狀態

3.線程狀態轉換示意圖

圖片描述

以上就是線程生命週期中的幾種狀態詳解及相互轉換。歡迎評論轉發。
另提供一些免費的IT視頻資料,架構師教程!如需要請查看https://www.592xuexi.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章