線程狀態(tài)圖
線程狀態(tài)圖
線程間的狀態(tài)轉(zhuǎn)換
- 新建(new):新創(chuàng)建了一個(gè)線程對象
- 可運(yùn)行(runnable):線程對象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中寥袭,等待被線程調(diào)度中,獲取CPU的使用權(quán)箩退。
- 運(yùn)行(running):可運(yùn)行狀態(tài)(runnable)的線程獲得了CPU時(shí)間片(timeslice),執(zhí)行程序代碼佳谦。
- 阻塞(block):阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了CPU使用權(quán)戴涝,也即讓出了CPU timeslice,暫停停止運(yùn)行钻蔑。直到線程進(jìn)入可運(yùn)行(runnable)狀態(tài)啥刻,才有機(jī)會(huì)再次獲得CPU timeslice 轉(zhuǎn)到運(yùn)行(running)狀態(tài)。阻塞的情況分三種:
- 等待阻塞:運(yùn)行(running)的線程執(zhí)行wait()方法咪笑,JVM會(huì)把該線程放入等待隊(duì)列(waitting queue)中可帽。
- 同步阻塞:運(yùn)行(running)的線程在獲取對象的同步鎖時(shí),若該同步鎖被別的線程占有窗怒,則JVM會(huì)把該線程放入鎖池(lock pool)中映跟。
- 其他阻塞:運(yùn)行(running)的線程執(zhí)行Thread.sleep()或join()方法蓄拣,或者發(fā)出了I/O請求時(shí),JVM會(huì)把該線程置為阻塞狀態(tài)努隙。當(dāng)sleep()狀態(tài)超時(shí)球恤、join()等待線程終止或者超時(shí)、或者I/O處理完成時(shí)剃法,該線程重新轉(zhuǎn)入可運(yùn)行(runnable)狀態(tài)碎捺。
- 死亡(dead):線程run()路鹰、main()方法執(zhí)行結(jié)束贷洲,或者因異常退出了run()方法,則該線程結(jié)束生命周期晋柱。死亡的線程不可再次復(fù)生优构。