Java 教程
Java 線程的生命周期中,在 Thread 類(lèi)里有一個(gè)枚舉類(lèi)型 State,定義了線程的幾種狀態(tài),分別有:
各個(gè)狀態(tài)說(shuō)明:
聲明:
public static final Thread.State NEW
實(shí)現(xiàn) Runnable 接口和繼承 Thread 可以得到一個(gè)線程類(lèi),new 一個(gè)實(shí)例出來(lái),線程就進(jìn)入了初始狀態(tài)。
聲明:
public static final Thread.State RUNNABLE
2.1. 就緒狀態(tài)
就緒狀態(tài)只是說(shuō)你資格運(yùn)行,調(diào)度程序沒(méi)有挑選到你,你就永遠(yuǎn)是就緒狀態(tài)。
調(diào)用線程的 start() 方法,此線程進(jìn)入就緒狀態(tài)。
當(dāng)前線程 sleep() 方法結(jié)束,其他線程 join() 結(jié)束,等待用戶(hù)輸入完畢,某個(gè)線程拿到對(duì)象鎖,這些線程也將進(jìn)入就緒狀態(tài)。
當(dāng)前線程時(shí)間片用完了,調(diào)用當(dāng)前線程的 yield() 方法,當(dāng)前線程進(jìn)入就緒狀態(tài)。
鎖池里的線程拿到對(duì)象鎖后,進(jìn)入就緒狀態(tài)。
2.2. 運(yùn)行中狀態(tài)
線程調(diào)度程序從可運(yùn)行池中選擇一個(gè)線程作為當(dāng)前線程時(shí)線程所處的狀態(tài)。這也是線程進(jìn)入運(yùn)行狀態(tài)的唯一一種方式。
聲明:
public static final Thread.State BLOCKED
阻塞狀態(tài)是線程阻塞在進(jìn)入synchronized關(guān)鍵字修飾的方法或代碼塊(獲取鎖)時(shí)的狀態(tài)。
聲明:
public static final Thread.State WAITING
處于這種狀態(tài)的線程不會(huì)被分配 CPU 執(zhí)行時(shí)間,它們要等待被顯式地喚醒,否則會(huì)處于無(wú)限期等待的狀態(tài)。
5. 超時(shí)等待 - TIMED_WAITING
聲明:
public static final Thread.State TIMED_WAITING
處于這種狀態(tài)的線程不會(huì)被分配 CPU 執(zhí)行時(shí)間,不過(guò)無(wú)須無(wú)限期等待被其他線程顯示地喚醒,在達(dá)到一定時(shí)間后它們會(huì)自動(dòng)喚醒。
聲明:
public static final Thread.State TERMINATED
當(dāng)線程的 run() 方法完成時(shí),或者主線程的 main() 方法完成時(shí),我們就認(rèn)為它終止了。這個(gè)線程對(duì)象也許是活的,但是,它已經(jīng)不是一個(gè)單獨(dú)執(zhí)行的線程。線程一旦終止了,就不能復(fù)生。
在一個(gè)終止的線程上調(diào)用 start() 方法,會(huì)拋出 java.lang.IllegalThreadStateException 異常。
以下實(shí)例演示了如何獲取線程的狀態(tài):
以上代碼運(yùn)行輸出結(jié)果為:
State of thread1 after creating it - NEW State of thread1 after calling .start() method on it - RUNNABLE State of thread2 after creating it - NEW State of thread2 after calling .start() method on it - RUNNABLE State of thread2 after calling .sleep() method on it - TIMED_WAITING State of thread1 while it called join() method on thread2 -WAITING State of thread2 when it has finished it's execution - TERMINATED其他擴(kuò)展