新建(new):新創(chuàng)建了一個線程對象。
就緒(可運行狀態(tài))(runnable):線程對象創(chuàng)建后,當(dāng)調(diào)用線程對象的 start()方法,該線程處于就緒狀態(tài),等待被線程調(diào)度選中,獲取cpu的使用權(quán)。
運行(running):可運行狀態(tài)(runnable)的線程獲得了cpu時間片(timeslice),執(zhí)行程序代碼。注:就緒狀態(tài)是進入到運行狀態(tài)的唯一入口,也就是說,線程要想進入運行狀態(tài)執(zhí)行,首先必須處于就緒狀態(tài)中;
阻塞(block):處于運行狀態(tài)中的線程由于某種原因,暫時放棄對 CPU的使用權(quán),停止執(zhí)行,此時進入阻塞狀態(tài),直到其進入到就緒狀態(tài),才 有機會再次被 CPU 調(diào)用以進入到運行狀態(tài)。
阻塞的情況分三種:
(一). 等待阻塞:運行狀態(tài)中的線程執(zhí)行 wait()方法,JVM會把該線程放入等待隊列(waitting queue)中,使本線程進入到等待阻塞狀態(tài);(二). 同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為鎖被其它線程所占用),,則JVM會把該線程放入鎖池(lock pool)中,線程會進入同步阻塞狀態(tài);(三). 其他阻塞: 通過調(diào)用線程的 sleep()或 join()或發(fā)出了 I/O 請求時,線程會進入到阻塞狀態(tài)。當(dāng) sleep()狀態(tài)超時、join()等待線程終止或者超時、或者 I/O 處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
死亡(dead)(結(jié)束):線程run()、main()方法執(zhí)行結(jié)束,或者因異常退出了run()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。