線程狀態(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)一個同步隊列。