多線(xiàn)程分為5種狀態(tài):
新建(New):新建線(xiàn)程在jvm虛擬機(jī)棧里,線(xiàn)程棧是私有的。而jvm中的本地方法棧是用于本地native方法的私有棧。
就緒(Runnable):也叫“可執(zhí)行狀態(tài)”調(diào)用start進(jìn)入可執(zhí)行狀態(tài)后并不是馬上運(yùn)行,而是處于可運(yùn)行線(xiàn)程池中隨時(shí)待命等待CPU的調(diào)度。
運(yùn)行(Running):當(dāng)獲取到CPU執(zhí)行權(quán)邊開(kāi)始從就緒狀態(tài)變成運(yùn)行狀態(tài),開(kāi)始執(zhí)行run()里面的方法。
阻塞(Blocked):當(dāng)失去 cpu 使用權(quán)的時(shí)候,便進(jìn)入到阻塞狀態(tài),等待再次搶占資源進(jìn)入就緒(runnable)狀態(tài)才有機(jī)會(huì)獲得運(yùn)行。阻塞分三種情況:
1).等待阻塞:執(zhí)行wait()方法,JVM將線(xiàn)程放入等待隊(duì)列(waitting queue)中。
2).同步阻塞:運(yùn)行的線(xiàn)程在獲取對(duì)象同步鎖時(shí),若該同步鎖被別的線(xiàn)程占用,則JVM會(huì)把該線(xiàn)程放入鎖池(lock pool)中。
3).其他阻塞:執(zhí)行sleep()或join()方法,或者I/O請(qǐng)求時(shí),JVM會(huì)把線(xiàn)程置為阻塞狀態(tài)。死亡(Dead):在線(xiàn)程執(zhí)行完run()、main()方法后線(xiàn)程結(jié)束,或者因?yàn)槟撤N異?;蛘咤e(cuò)誤而終止運(yùn)行。
以下是從網(wǎng)上找到的一張狀態(tài)轉(zhuǎn)化圖:

以上圖比較詳細(xì),只說(shuō)幾個(gè)需要注意的點(diǎn):
1.sleep()與wait()的區(qū)別:都使線(xiàn)程從running變成blocked狀態(tài),但是sleep是Thread類(lèi)的方法,wait是Object的方法,所以sleep不能改變對(duì)象鎖也就不能釋放鎖資源,仍然占有鎖資源,而wait會(huì)釋放當(dāng)前對(duì)象的鎖資源。
2.阻塞恢復(fù)的線(xiàn)程不一定會(huì)馬上去執(zhí)行,因?yàn)镃PU可能還在執(zhí)行其他的任務(wù),只是擁有CPU執(zhí)行權(quán)繼續(xù)競(jìng)爭(zhēng)。
3.join():等待別的線(xiàn)程執(zhí)行完了自己再執(zhí)行。
4.yield():是將running中的線(xiàn)程“退讓”成runnable的狀態(tài),也就是讓執(zhí)行中的線(xiàn)程編程可執(zhí)行的狀態(tài)重新進(jìn)行競(jìng)爭(zhēng)(不一定能競(jìng)爭(zhēng)上)。