JAVA深化篇_27—— 多線程之線程狀態(tài)和生命周期【詳細(xì)介紹】
線程狀態(tài)和生命周期
一個(gè)線程對象在它的生命周期內(nèi),需要經(jīng)歷5個(gè)狀態(tài)。
-
新生狀態(tài)(New)
用new關(guān)鍵字建立一個(gè)線程對象后,該線程對象就處于新生狀態(tài)。處于新生狀態(tài)的線程有自己的內(nèi)存空間,通過調(diào)用start方法進(jìn)入就緒狀態(tài)。
-
就緒狀態(tài)(Runnable)
處于就緒狀態(tài)的線程已經(jīng)具備了運(yùn)行條件,但是還沒有被分配到CPU,處于“線程就緒隊(duì)列”,等待系統(tǒng)為其分配CPU。就緒狀態(tài)并不是執(zhí)行狀態(tài),當(dāng)系統(tǒng)選定一個(gè)等待執(zhí)行的Thread對象后,它就會進(jìn)入執(zhí)行狀態(tài)。一旦獲得CPU,線程就進(jìn)入運(yùn)行狀態(tài)并自動調(diào)用自己的run方法。有4種原因會導(dǎo)致線程進(jìn)入就緒狀態(tài):
- 新建線程:調(diào)用start()方法,進(jìn)入就緒狀態(tài);
- 阻塞線程:阻塞解除,進(jìn)入就緒狀態(tài);
- 運(yùn)行線程:調(diào)用yield()方法,直接進(jìn)入就緒狀態(tài);
- 運(yùn)行線程:JVM將CPU資源從本線程切換到其他線程。
-
運(yùn)行狀態(tài)(Running)
在運(yùn)行狀態(tài)的線程執(zhí)行自己run方法中的代碼,直到調(diào)用其他方法而終止或等待某資源而阻塞或完成任務(wù)而死亡。如果在給定的時(shí)間片內(nèi)沒有執(zhí)行結(jié)束,就會被系統(tǒng)給換下來回到就緒狀態(tài)。也可能由于某些“導(dǎo)致阻塞的事件”而進(jìn)入阻塞狀態(tài)。
-
阻塞狀態(tài)(Blocked)
阻塞指的是暫停一個(gè)線程的執(zhí)行以等待某個(gè)條件發(fā)生(如某資源就緒)。
有4種原因會導(dǎo)致阻塞:
- 執(zhí)行sleep(int millsecond)方法,使當(dāng)前線程休眠,進(jìn)入阻塞狀態(tài)。當(dāng)指定的時(shí)間到了后,線程進(jìn)入就緒狀態(tài)。
- 執(zhí)行wait()方法,使當(dāng)前線程進(jìn)入阻塞狀態(tài)。當(dāng)使用nofity()方法喚醒這個(gè)線程后,它進(jìn)入就緒狀態(tài)。
- 線程運(yùn)行時(shí),某個(gè)操作進(jìn)入阻塞狀態(tài),比如執(zhí)行IO流操作(read()/write()方法本身就是阻塞的方法)。只有當(dāng)引起該操作阻塞的原因消失后,線程進(jìn)入就緒狀態(tài)。
- join()線程聯(lián)合: 當(dāng)某個(gè)線程等待另一個(gè)線程執(zhí)行結(jié)束后,才能繼續(xù)執(zhí)行時(shí),使用join()方法。
-
死亡狀態(tài)(Terminated)
死亡狀態(tài)是線程生命周期中的最后一個(gè)階段。線程死亡的原因有兩個(gè)。一個(gè)是正常運(yùn)行的線程完成了它run()方法內(nèi)的全部工作; 另一個(gè)是線程被強(qiáng)制終止,如通過執(zhí)行stop()或destroy()方法來終止一個(gè)線程(注:stop()/destroy()方法已經(jīng)被JDK廢棄,不推薦使用)。
當(dāng)一個(gè)線程進(jìn)入死亡狀態(tài)以后,就不能再回到其它狀態(tài)了。
浙公網(wǎng)安備 33010602011771號