1. 程式人生 > >執行緒生命週期你知道多少?

執行緒生命週期你知道多少?

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003
百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!


從之前的案例我們瞭解到多執行緒的作用優勢,這裡我們更詳細的瞭解執行緒的建立和結束。

執行緒的生命週期主要分為以下幾個階段:
- 新建(new Thread)
- 就緒(runnable)
- 執行(running)
- 堵塞(blocked)
- 死亡(dead)

之前我們的案例中直接的看到的以上狀態有“新建、死亡”,那麼其他狀態是怎麼樣子的呢?下面我們逐個詳細講解。

新建

新建執行緒的方法有幾種,一種就是繼承Thread,一種就是實現runnable介面,還有執行緒池等方法。之前的案例,我們就是使用的匿名內部內Thread來啟動的執行緒。但是使用關鍵字new建立一個Thread物件時,此時它並不處於執行狀態,因為它沒有呼叫start方法啟動該執行緒。所以這裡我們可以這樣認為,使用new之後沒有使用start啟動的執行緒,都是屬於處在新建狀態的執行緒。

就緒

使用new新建執行緒之後,其實只是準別新建執行緒,真正在JVM程序中建立一個執行緒是在我們使用start啟動之後。但是很多人在這裡有認識誤區,以為使用start啟動之後,執行緒就啟動了,在認知中就緒是很容易被忽略的。

其實使用start之後,執行緒只是進入了可以被執行的狀態而已。並不是已使用start就開始執行,主要的原因是我們的所有執行緒和程序都受到CPU的管理。如果CPU一直在執行其它任務,並沒有來呼叫該執行緒,那麼從start之後到被呼叫之前就叫做就緒

執行

當CPU在執行佇列中選中了執行緒之後,我們的執行緒就進入了執行狀態。可能如果使用CPU排程之類的說比較抽象,不容易觀察。那麼我們可以根據之前案例來了解。比如之前我們使用的案例,一個在看書,一個在聽音樂。這是兩個執行緒的,當我們觀察到兩個while迴圈在不斷執行的時候那就是執行緒的執行。

阻塞

多數的執行緒阻塞都是人為使用手段進行干預造成的,但是這也是我們編寫程式不可以缺少的一部分,就上文中的案例中,我們可以看到while死迴圈是個一小會列印一行,個一小會列印一行,這個輸出結果其實就是我們在其中使用阻塞完成的。
一般使執行緒阻塞的方法以下幾種:
- sleep或者wait,上文用的就是sleep,使執行緒休息一秒
- 執行緒主動呼叫yield方法,放棄CPU執行
- 獲取某個已經鎖定的資源

以上的方法也可以經過程式被喚醒,讓程式繼續執行。
- Wait中的執行緒被其他notify/notifyall喚醒
- sleep等待休息時間即可,不需要喚醒。

死亡

死亡是一個執行緒的最終狀態,同時也意味著執行緒的整個生命週期結束。執行緒的死亡有多種方式
- 執行緒執行正常結束,結束生命週期
- 執行緒執行錯誤意外結束
- JVM 意外崩潰、中斷,導致所有執行緒結束