1. 程式人生 > >Java 多執行緒(三)—— 執行緒的生命週期及方法

Java 多執行緒(三)—— 執行緒的生命週期及方法

這篇部落格介紹執行緒的生命週期。

  執行緒是一個動態執行的過程,它也有從建立到死亡的過程。

執行緒的幾種狀態

在 Thread 類中,有一個列舉內部類:

上面的資訊以圖片表示如下:

  第一張圖:

 第二張圖:把等待、計時等待、阻塞看成阻塞一個狀態了

1、新建狀態(new):使用 new 建立一個執行緒,僅僅只是在堆中分配了記憶體空間

           新建狀態下,執行緒還沒有呼叫 start()方法啟動,只是存在一個執行緒物件而已

          Thread t = new Thread();//這就是t執行緒的新建狀態

2、可執行狀態(runnable):新建狀態呼叫 start() 方法,進入可執行狀態。而這個又分成兩種狀態,ready 和 running,分別表示就緒狀態和執行狀態

    就緒狀態:執行緒物件呼叫了 start() 方法,等待 JVM 的排程,(此時該執行緒並沒有執行)

    執行狀態:執行緒物件獲得 JVM 排程,如果存在多個 CPU,那麼執行多個執行緒並行執行

  注意:執行緒物件只能呼叫一次 start() 方法,否則報錯:illegaThreadStateExecptiong

3、阻塞狀態(blocked):正在執行的執行緒因為某種原因放棄 CPU,暫時停止執行,就會進入阻塞狀態。此時 JVM 不會給執行緒分配 CPU,知道執行緒重新進入就緒狀態,才有機會轉到 執行狀態。

  注意:阻塞狀態只能先進入就緒狀態,不能直接進入執行狀態

  阻塞狀態分為兩種情況:

    ①、當執行緒 A 處於可執行狀態中,試圖獲取同步鎖時,卻被 B 執行緒獲取,此時 JVM 把當前 A 執行緒放入鎖池中,A執行緒進入阻塞狀態

    ②、當執行緒處於執行狀態時,發出了 IO 請求,此時進入阻塞狀態

4、等待狀態(waiting):等待狀態只能被其他執行緒喚醒,此時使用的是無引數的 wait() 方法

  ①、當執行緒處於執行狀態時,呼叫了 wait() 方法,此時 JVM 把該執行緒放入等待池中

5、計時等待(timed waiting):呼叫了帶引數的 wait(long time)或 sleep(long time) 方法

  ①、當執行緒處於執行狀態時,呼叫了帶引數 wait 方法,此時 JVM 把該執行緒放入等待池中

  ②、當前執行緒呼叫了 sleep(long time) 方法

6、終止狀態(terminated):通常稱為死亡狀態,表示執行緒終止

  ①、正常終止,執行完 run() 方法,正常結束

  ②、強制終止,如呼叫 stop() 方法或 destory() 方法

  ③、異常終止,執行過程中發生異常