線程的生命周期,狀態(tài)是如何轉(zhuǎn)移的

在?Java?語言中,一個線程從其創(chuàng)建、啟動到其運(yùn)行結(jié)束的整個生命周期可能經(jīng)歷若干狀態(tài),如圖所示。

Java線程的狀態(tài)可以使用監(jiān)控工具查看,也可以通過Thread.getState()調(diào)用來獲取。?Thread.getState()的返回值類型?Thread.State?是一個枚舉類型(Enum)。Thread.State所定義的線程狀態(tài)包括以下幾種。

NEW:一個已創(chuàng)建而未啟動的線程處于該狀態(tài)。由于一個線程實(shí)例只能夠被啟動一次,因此一個線程只可能有一次處于該狀態(tài)。

RUNNABLE:該狀態(tài)可以被看成一個復(fù)合狀態(tài)?。它包括兩個子狀態(tài):READY?和?RUNNING。前者表示處于該狀態(tài)的線程可以被線程調(diào)度器(?Scheduler?)?進(jìn)行調(diào)度而使之處于?RUNNING?狀態(tài)?。后者表示處于該狀態(tài)的線程正在運(yùn)行,即相應(yīng)線程對象的?run?方法?所對應(yīng)的指令正在由處理器執(zhí)行。執(zhí)行Thread.yield()的線程,其狀態(tài)可能會由RUNNING?轉(zhuǎn)換為?READY。處于?READY?子狀態(tài)的線程也被稱為活躍線程。

BLOCKED:一個線程發(fā)起一個阻塞式I/O(Blocking?I/O?)操作后,或者申請一個由其他線程持有的獨(dú)占資源(比如鎖)時,相應(yīng)的線程會處于該狀態(tài)。處于BLOCKED?狀態(tài)的線程并不會占用處理器資源。當(dāng)阻塞式I/O操作完成后,或者線程獲得了其申請的資源,該線程的狀態(tài)又可以轉(zhuǎn)換為RUNNABLE。

WAITING:一個線程執(zhí)行了某些特定方法之后就會處于這種等待其他線程執(zhí)行另外一些特定操作的狀態(tài)。能夠使其執(zhí)行線程變更為?WAITING?狀態(tài)的方法包括:Object.wait?()?、?Thread.join()和?LockSupport.park(Object)。能夠使相應(yīng)線程從?WAITING?變更為?RUNNABLE?的相應(yīng)方法包括?:Object.notify()/notify?All()和?LockSupport.?Unpark(Object)。

TIMED?WAITING:該狀態(tài)和WAITING?類似,差別在于處于該狀態(tài)的線程并非無限制地等待其他線程執(zhí)行特定操作,而是處于帶有時間限制的等待狀態(tài)。當(dāng)其他線程沒有在指定時間內(nèi)執(zhí)行該線程所期望的特定操作時,該線程的狀態(tài)自動轉(zhuǎn)換為RUNNABLE。

TERMINATED:已經(jīng)執(zhí)行結(jié)束的線程處于該狀態(tài)。由于一個線程實(shí)例只能夠被啟動一次,因此一個線程也只可能有一次處于該狀態(tài)。Thread.run()正常返回或者由于拋出異常而提前終止都會導(dǎo)致相應(yīng)線程處于該狀態(tài)。

一個線程在其整個生命周期中,只可能有一次處于NEW狀態(tài)和?TERMINATED?狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容