Jakartase_多線程 --- 線程的5大狀態(貳)

1、前言:

  • 一個線程對象在它的生命週期內,須要經歷5個狀態。下面是對這5個狀態的詳述

2、狀態概述

  • 初始狀態(New)
  • 就緒狀態(Runnable)
  • 運行狀態(Running)
  • 阻塞狀態(Blocked)
  • 死亡狀態(Terminated)

3、狀態詳述

3.一、初始狀態(New)

  • 描述:處於新生狀態的線程有本身的內存空間,經過調用start()方法進入就緒狀態
  • 條件:用new關鍵字創建一個線程對象後,該線程對象就處於新生狀態。

3.二、就緒狀態(Runnable)

  • 描述java

    • 處於就緒狀態的線程已經具有了運行條件,可是尚未被分配到CPU,處於「線程就緒隊列」,等待系統爲其分配cpu。
    • 就緒狀態並非執行狀態,當系統選定一個等待執行的Thread對象後,它就會進入執行狀態。安全

      • 一旦得到cpu,線程就進入運行狀態並自動調用本身的run()方法
  • 條件多線程

    1. 新建線程:調用**start()**方法,進入就緒狀態;
     2. 阻塞線程:阻塞解除,進入就緒狀態; 當前線程sleep()方法結束,
        其餘線程join結束,等待用戶輸入完畢,某個線程拿到對象鎖,
        這些線程也將進入就緒狀態。
     3. 運行線程:當前線程時間片用完了,調用**yield()**方法,直接進入就緒狀態;
     4. 運行線程:JVM將CPU資源從本線程切換到其餘線程。

3.三、運行狀態(Running)

  • 描述 :處於運行狀態的線程最爲複雜。線程

    • 就緒狀態的線程在得到CPU時間片後變爲運行狀態(running)
    • 獲得cpu的調度後,在運行狀態的線程執行本身run()方法中的代碼,直到調用其餘方法而終止或等待某資源而阻塞或完成任務而死亡
    • 若是在給定的時間片內沒有執行完畢 / 該線程失去了cpu資源,就會又從運行狀態變爲就緒狀態。
    • 沒有執行完畢被換下後,也可能因爲某些「致使阻塞的事件」而進入阻塞狀態。
  • 線程從運行狀態變爲阻塞狀態的條件code

    • ①、線程調用sleep()方法主動放棄所佔用的系統資源
    • ②、線程調用一個阻塞式IO方法,在該方法返回以前,該線程被阻塞
    • ③、線程試圖得到一個同步監視器,但更改同步監視器正被其餘線程所持有
    • ④、線程在等待某個通知(notify()
    • ⑤、程序調用了線程的suspend()方法將線程掛起對象

      • 注:suspend()容易致使死鎖,程序應該儘可能避免使用該方法
  • 線程從運行狀態變爲死亡狀態的條件生命週期

    • ①、當線程的run()方法執行完,
    • ②、線程被強制性地終止,例如出現異常
    • ③、調用了stop()、desyory()

3.四、阻塞狀態 (Blocked)

  • 描述隊列

    • 阻塞指的是暫停一個線程的執行以等待某個條件發生(如某資源就緒)
    • 阻塞狀態是線程阻塞在進入synchronized關鍵字修飾的方法或代碼塊(獲取鎖)時的狀態
  • 條件事件

    1. 執行sleep(int millsecond)方法,使當前線程休眠,進入阻塞狀態。
         當指定的時間到了後,線程進入就緒狀態。
      2. 執行wait()方法,使當前線程進入阻塞狀態。當使用nofity()方法喚醒這個線程後, 
         它進入就緒狀態。
      3. 線程運行時,某操做會阻塞,eg:執行IO流操做(read()/write()方法自己就是阻塞的方法)。
         只有當引發該操做阻塞的緣由消失後,線程進入就緒狀態。
      4. join()線程聯合: 當某個線程等待另外一個線程執行結束後,才能繼續執行時,
         使用join()方法。
    • 內存

      sleep()方法,線程是抱着資源睡覺(不釋放資源)。
  • 分類

    - **等待阻塞:**運行狀態的線程執行 `wait()`方法,使線程進入到**等待阻塞**狀態。
    - **同步阻塞:**線程在獲取 `synchronized` 同步鎖**失敗**(由於同步鎖被其餘線程佔用)。
    - **其餘阻塞:**
      - 經過調用線程的 `sleep()` 或 `join()` 發出了 `I/O` 請求時,線程就會進入到阻塞狀態。
      - 當`sleep()` 狀態超時,`join()` 等待線程終止或超時,或者 `I/O` 處理完畢,線程從新轉入就緒狀態。

3.五、死亡狀態 (Terminated)

  • 描述

    • 死亡狀態是線程生命週期中的最後一個階段,不能復生。
    • 在一個終止的線程上調用start()方法,會拋出 java.lang.IllegalThreadStateException異常
  • 緣由

    1.正常運行的線程完成了它run()方法內的所有工做
     2.線程被強制終止,如經過執行stop()或destroy()方法來終止一個線程。
       (注:stop()、destroy()方法已經被JDK廢棄,不推薦使用,不安全)。   
     3.線程拋出未捕獲的異常

4、續...

相關文章
相關標籤/搜索