更新時間:2023-11-07 來源:黑馬程序員 瀏覽量:
在Java中,要想實現(xiàn)多線程,就必須在主線程中創(chuàng)建新的線程對象。當線程對象創(chuàng)建完成時,線程的生命周期也就開始了,當run()方法正常執(zhí)行完畢,或者出現(xiàn)未捕獲的異?;蛘咤e誤的時候,線程的生命周期便結束了。線程的生命周期中包含五種狀態(tài),分別是新建狀態(tài)、就緒狀態(tài)、運行狀態(tài)、阻塞狀態(tài)和死亡狀態(tài),線程的不同狀態(tài)表明了線程當前正在進行的活動。在程序中,通過一些操作可以使線程在不同狀態(tài)之間進行轉換,如圖6-6所示。
圖6-6展示了線程各種狀態(tài)的轉換關系,箭頭表示可轉換的方向,其中,單箭頭表示狀態(tài)只能單向轉換,雙箭頭表示兩種狀態(tài)可以互相轉換,下面針對線程的五種狀態(tài)分別進行詳細講解。
圖6-6 線程狀態(tài)轉換圖
當線程對象創(chuàng)建成功后,線程就處于新建狀態(tài),處于新建狀態(tài)的線程僅僅是在Java虛擬機中分配了內容空間,此時還不能運行。
當線程對象調用了start()方法后,就進入了就緒狀態(tài),處于就緒狀態(tài)的線程位于可運行池中,具備運行的條件,能否獲得CPU的執(zhí)行權需要等待系統(tǒng)調度。
當就緒狀態(tài)的線程獲得CPU的執(zhí)行權,并開始執(zhí)行run()方法時,線程處于運行狀態(tài)。一個線程啟動后,它可能不會一直處于運行狀態(tài),當運行狀態(tài)的線程使用完系統(tǒng)分配的時間后,系統(tǒng)就會剝奪該線程占用的CPU資源,讓其他線程獲得執(zhí)行的機會。需要注意的是,只有處于就緒狀態(tài)的線程才可能轉換到運行狀態(tài)。
一個正在執(zhí)行的線程在某些特殊情況下,如果被認為掛起或需要執(zhí)行耗時的輸入/輸出操作時,會讓出CPU的執(zhí)行權進入阻塞狀態(tài)。進入阻塞狀態(tài)的線程不能進入排隊隊列,只有當引起阻塞的原因被消除后,線程才可以轉入就緒狀態(tài)。
線程調用stop()方法時或run()方法執(zhí)行結束后,即處于死亡狀態(tài)。處于死亡狀態(tài)的線程不具有繼續(xù)運行的能力,也不能轉換到其他狀態(tài)。
本文版權歸黑馬程序員Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓學院
首發(fā):https://java.itheima.com