當線程被建立並啓動之後,它既不是一啓動就進入了執行狀態,也不是一直處於執行狀態。 在線程的生命週期中,它要通過新建(New)、就緒(Runnable)、運行(Running)、阻塞 (Blocked)和死亡(Dead)5 種狀態。尤爲是當線程啓動之後,它不可能一直"霸佔"着 CPU 獨自 運行,因此 CPU 須要在多條線程之間切換,因而線程狀態也會屢次在運行、阻塞之間切換線程
當程序使用 new 關鍵字建立了一個線程以後,該線程就處於新建狀態,此時僅由 JVM 爲其分配 內存,並初始化其成員變量的值對象
當線程對象調用了 start()方法以後,該線程處於就緒狀態。Java 虛擬機會爲其建立方法調用棧和 程序計數器,等待調度運行。生命週期
若是處於就緒狀態的線程得到了 CPU,開始執行 run()方法的線程執行體,則該線程處於運行狀 態。隊列
阻塞狀態是指線程由於某種緣由放棄了 cpu 使用權,也即讓出了 cpu timeslice,暫時中止運行。 直到線程進入可運行(runnable)狀態,纔有機會再次得到 cpu timeslice 轉到運行(running)狀 態。阻塞的狀況分三種:內存
等待阻塞(o.wait->等待對列):同步
運行(running)的線程執行 o.wait()方法,JVM 會把該線程放入等待隊列(waitting queue) 中。虛擬機
同步阻塞(lock->鎖池)it
運行(running)的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則 JVM 會把該線 程放入鎖池(lock pool)中。io
其餘阻塞(sleep/join)變量
運行(running)的線程執行 Thread.sleep(long ms)或 t.join()方法,或者發出了 I/O 請求時, JVM 會把該線程置爲阻塞狀態。當 sleep()狀態超時、join()等待線程終止或者超時、或者 I/O 處理完畢時,線程從新轉入可運行(runnable)狀態。
正常結束
run()或 call()方法執行完成,線程正常結束。 異常結束線程拋出一個未捕獲的 Exception 或 Error。 調用 stop直接調用該線程的 stop()方法來結束該線程—該方法一般容易致使死鎖,不推薦使用。