線程生命週期總結

多線程是好多編程語言中的一個重要組成部分,尤爲在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狀態spa

  • 2.5 線程的TERMINATED狀態

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

3.線程狀態轉換示意圖

圖片描述

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

相關文章
相關標籤/搜索