說一下線程的聲明周期?
答:1.新建狀態
2.就緒狀態
3.運行狀態
4.阻塞狀態
5.死亡狀態
具體描述一下每一個狀態?
答:
1.新建狀態:
用new關鍵字建立一個線程后,該線程對象就處於新建狀態。處於新生狀態的線程有自己的內存空間,通過調用start()方法進入就緒狀態。
2.就緒狀態:
處於就緒狀態線程具備了運行條件,但還沒分配到CPU,處於線程就緒隊列,等待系統為其分配CPU。當系統選定一個等待執行的線程后,它就會從就緒狀態進入運行狀態,該動作稱為“CPU調度”。
3.運行狀態
在運行狀態的線程執行自己的run方法中代碼,直到等待某資源而阻塞或完成任何而死亡。如果在給定的時間片內沒有執行結束,就會被系統給換下來回到就緒狀態。
4.阻塞狀態
處於運行狀態的線程在某些情況下,如執行了sleep(睡眠)方法,或等待I/O設備等資源,將讓出CPU並暫時停止自己運行,進入阻塞狀態。
在阻塞狀態的線程不能進入就緒隊列。只有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O設備空閑下來,線程便轉入就緒狀態,重新到就緒隊列中排隊等待,被系統選中后從原來停止的位置開始繼續執行。
5.死亡狀態
死亡狀態是線程生命周期中的最后一個階段。線程死亡的原因有三個,一個是正常運行的線程完成了它的全部工作;另一個是線程被強制性地終止,如通過stop方法來終止一個線程【不推薦使用】;三是線程拋出未捕獲的異常。
狀態之間的轉換圖:
線程進入阻塞狀態的原因有哪些?
答:1.等待I/O流的輸入輸出
2.等待網絡資源,即網速問題
3.調用sleep()方法,需要等sleep時間結束
4.調用wait()方法,需要調用notify()喚醒線程
5.其他線程執行join()方法,當前線程則會阻塞,需要等其他線程執行完。
線程進入死亡狀態的原因有哪些?
答:1.線程正常完成工作
2.調用stop()方法,強行停止線程
3.外部原因中斷線程
注意1: