1. 程式人生 > >線程的生命周期和線程的狀態轉換圖

線程的生命周期和線程的狀態轉換圖

不可 創建 例如 上進 notify alt lee 我們 當前

一、線程的生命周期

  1、線程的5種狀態:新建(New),就緒(Runnable),運行(Running),阻塞(Blocked),死亡(Dead)

  2、線程的生命周期圖解:(參考傳智播客劉意2015Java基礎視頻講義)

技術分享圖片

二、線程的狀態轉換圖

  1、線程的5種狀態:新建(New),就緒(Runnable),運行(Running),阻塞(Blocked),死亡(Dead)

    線程變化的狀態轉換圖例如以下:

      1)新建狀態(New):新創建了一個線程對象。

      2就緒狀態(Runnable):線程對象創建後,其它線程調用了該對象的start()方法。該狀態的線程位於可執行線程池中,變得可執行,等待獲取CPU的使用權。

      3執行狀態(Running):就緒狀態的線程獲取了CPU。執行程序代碼。

      4堵塞狀態(Blocked):堵塞狀態是線程由於某種原因放棄CPU使用權。臨時停止執行。直到線程進入就緒狀態,才有機會轉到執行狀態。

        堵塞的情況分三種:

          (一)等待堵塞:執行的線程執行wait()方法,JVM會把該線程放入等待池中。

          (二)同步堵塞:執行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用。則JVM會把該線程放入鎖池中。

          (三)其它堵塞:執行的線程執行sleep()或join()方法,或者發出了I/O請求時。JVM會把該線程置為堵塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完成時。線程又一次轉入就緒狀態。

      5死亡狀態(Dead):線程運行完了或者因異常退出了run()方法,該線程結束生命周期。

  2、線程的狀態轉換圖(參考傳智播客劉意2015Java基礎視頻講義)

技術分享圖片

  3、解釋(參考 https://www.cnblogs.com/bhlsheji/p/5099362.html)

    1)線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但無論如何,當我們new了這個對象後。線程就進入了初始狀態;

    2當該對象調用了start()方法,就進入可執行狀態;

    3)進入可執行狀態後,當該對象被操作系統選中。獲得CPU時間片就會進入執行狀態;

    4)進入執行狀態後情況就比較復雜了

      (1)run()方法或main()方法結束後,線程就進入終止狀態;

      (2)當線程調用了自身的sleep()方法或其它線程的join()方法,就會進入堵塞狀態(該狀態既停止當前線程,但並不釋放所占有的資源)。當sleep()結束或join()結束後。該線程進入可執行狀態,繼續等待OS分配時間片;

      (3)線程調用了yield()方法,意思是放棄當前獲得的CPU時間片,回到可執行狀態,這時與其它進程處於同等競爭狀態,OS有可能會接著又讓這個進程進入執行狀態;

      (4)當線程剛進入可執行狀態(註意,還沒執行),發現將要調用的資源被synchroniza(同步),獲取不到鎖標記。將會馬上進入鎖池狀態,等待獲取鎖標記(這時的鎖池裏或許已經有了其它線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程獲得鎖標記後,就轉入可執行狀態。等待OS分配CPU時間片;

      (5)當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所占有的全部資源,與堵塞狀態不同)。進入這個狀態後。是不能自己主動喚醒的,必須依靠其它線程調用notify()或notifyAll()方法才幹被喚醒(因為notify()僅僅是喚醒一個線程,但我們由不能確定詳細喚醒的是哪一個線程。或許我們須要喚醒的線程不可以被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池。等待獲取鎖標記。

線程的生命周期和線程的狀態轉換圖