1. 程式人生 > >Java基礎及提高 之 執行緒的生命週期

Java基礎及提高 之 執行緒的生命週期

生命週期

一個事物從出生的那一刻開始到最終死亡中間的整個過程.

在事物的漫長的生命週期過程中,總會經歷不同的狀態(嬰兒狀態/青少年狀態/中年狀態/老年狀態...).

執行緒也是有生命週期的,也是存在不同的狀態的,狀態相互之間的轉換.

1:新建狀態(new):使用new建立一個執行緒物件,僅僅在堆中分配記憶體空間,在呼叫start方法之前.

   新建狀態下,執行緒壓根就沒有啟動,僅僅只是存在一個執行緒物件而已.

   Thread t = new Thread();//此時t就屬於新建狀態

    當新建狀態下的執行緒物件呼叫了start方法,此時從新建狀態進入可執行狀態.

    執行緒物件的

start方法只能呼叫一次,否則報錯:IllegalThreadStateException.

2:可執行狀態(runnable):分成兩種狀態,ready和running。分別表示就緒狀態和執行狀態。

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

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

3:阻塞狀態(blocked):正在執行的執行緒因為某些原因放棄CPU,暫時停止執行,就會進入阻塞狀態.

         此時JVM不會給執行緒分配CPU,直到執行緒重新進入就緒狀態,才有機會轉到執行狀態

.

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

   阻塞狀態的兩種情況:

       1):當A執行緒處於執行過程時,試圖獲取同步鎖時,卻被B執行緒獲取.此時JVM把當前A執行緒存到物件的鎖池中,A執行緒進入阻塞狀態.

       2):當執行緒處於執行過程時,發出了IO請求時,此時進入阻塞狀態. 

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

       1):當執行緒處於執行過程時,呼叫了wait()方法,此時JVM把當前執行緒存在物件等待池中.

5:計時等待狀態(timed waiting)

(使用了帶引數的wait方法或者sleep方法)

       1):當執行緒處於執行過程時,呼叫了wait(long time)方法,此時JVM把當前執行緒存在物件等待池中.

       2):當前執行緒執行了sleep(long time)方法.

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

        1):正常執行完run方法而退出(正常死亡).

        2):遇到異常而退出(出現異常之後,程式就會中斷)(意外死亡).

-------------------------------------------------------------------

執行緒一旦終止,就不能再重啟啟動,否則報錯(IllegalThreadStateException).

Thread類中過時的方法(因為存線上程安全問題,所以棄用了):

 void suspend() :暫停當前執行緒

 void resume()  :恢復當前執行緒

 void stop()  :結束當前執行緒