線程的六種狀態(tài)

線程狀態(tài)。線程可以處于以下狀態(tài)之一:

NEW尚未啟動的線程處于此狀態(tài)。

RUNNABLE在Java虛擬機中執(zhí)行的線程處于此狀態(tài)。

BLOCKED被阻塞等待監(jiān)視器鎖定的線程處于此狀態(tài)。

WAITING無限期等待另一個線程執(zhí)行特定操作的線程處于此狀態(tài)。

TIMED_WAITING正在等待另一個線程執(zhí)行最多指定等待時間的操作的線程處于此狀態(tài)。

TERMINATED已退出的線程處于此狀態(tài)。

線程在給定時間點只能處于一種狀態(tài)。 這些狀態(tài)是虛擬機狀態(tài),不反映任何操作系統(tǒng)線程狀態(tài)。

1、初始狀態(tài):

實現(xiàn)Runnable接口和繼承Thread可以得到一個線程類,new一個實例出來,線程就進(jìn)入了初始狀態(tài)。

2、就緒狀態(tài)

就緒狀態(tài)只是說你資格運行,調(diào)度程序沒有挑選到你,你就永遠(yuǎn)是就緒狀態(tài)。

調(diào)用線程的start()方法,此線程進(jìn)入就緒狀態(tài)。

當(dāng)前線程sleep()方法結(jié)束,其他線程join()結(jié)束,等待用戶輸入完畢,某個線程拿到對象鎖,這些線程也將進(jìn)入就緒狀態(tài)。

當(dāng)前線程時間片用完了,調(diào)用當(dāng)前線程的yield()方法,當(dāng)前線程進(jìn)入就緒狀態(tài)。

鎖池里的線程拿到對象鎖后,進(jìn)入就緒狀態(tài)。

線程調(diào)度程序從可運行池中選擇一個線程作為當(dāng)前線程時線程所處的狀態(tài)。這也是線程進(jìn)入運行狀態(tài)的唯一一種方式。

3、阻塞狀態(tài)

阻塞狀態(tài)是線程阻塞在進(jìn)入synchronized關(guān)鍵字修飾的方法或代碼塊(獲取鎖)時的狀態(tài)。

4、等待狀態(tài)

處于這種狀態(tài)的線程不會被分配CPU執(zhí)行時間,它們要等待被顯式地喚醒,否則會處于無限期等待的狀態(tài)。

5、超時等待狀態(tài)

處于這種狀態(tài)的線程不會被分配CPU執(zhí)行時間,不過無須無限期等待被其他線程顯示地喚醒,在達(dá)到一定時間后它們會自動喚醒。

6、終止?fàn)顟B(tài)

當(dāng)線程的run()方法完成時,或者主線程的main()方法完成時,我們就認(rèn)為它終止了。這個線程對象也許是活的,但是,它已經(jīng)不是一個單獨執(zhí)行的線程。線程一旦終止了,就不能復(fù)生。

在一個終止的線程上調(diào)用start()方法,會拋出java.lang.IllegalThreadStateException異常。

等待隊列

調(diào)用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) 代碼段內(nèi)。

同步隊列狀態(tài)

當(dāng)前線程想調(diào)用對象A的同步方法時,發(fā)現(xiàn)對象A的鎖被別的線程占有,此時當(dāng)前線程進(jìn)入同步隊列。簡言之,同步隊列里面放的都是想爭奪對象鎖的線程。

當(dāng)一個線程1被另外一個線程2喚醒時,1線程進(jìn)入同步隊列,去爭奪對象鎖。

同步隊列是在同步的環(huán)境下才有的概念,一個對象對應(yīng)一個同步隊列。

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

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