[操作系統] 線程5種狀態詳解及常見問題解決

1 線程的概念

線程是進程的子任務,是CPU調度和分派的基本單位,用於保證時序的實時性,實現進程內部的併發。

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器、一組寄存器和棧),但是它可與屬於同一個進程的其他線程共享進程的全部資源。

2 線程的5種狀態

每個Java 程序都有一個缺省的主線程,對於Java程序,主線程是main()方法執行的線索
對於Applet程序,主線程是指瀏覽器加載並執行 Java Applet程序的探索。
要想實現多線程,必須在主線程中創建新的線程對象。

任何線程一般都具有五種狀態,即創建、就緒、運行、阻塞、終止。

  • (1) 新生狀態
    在程序中用構造方法(new操作符)創建一個新線程時,如new Thread(r),該線程就是創建狀態,此時它已經有了相應的內存空間和其它資源,但是還沒有開始執行。

  • (2)就緒狀態
    新建線程對象後,調用該線程的start()方法就可以啓動線程。當線程啓動時,線程就進入就緒狀態(runnable)
    由於還沒有分配CPU,線程將進入線程隊列排隊,等待CPU服務,這表明它已經具備了運行條件。
    當系統挑選一個等待執行的Thread對象後,它就會從等待狀態進入執行狀態。系統挑選的動作稱之爲“CPU調度”。
    一旦獲得CPU,線程就進入運行狀態並自動調用自己的run方法。

  • (3)運行狀態
    當就緒狀態的線程被調用並獲得處理器資源時,線程就進入了運行狀態。此時,自動調用該線程對象的run()方法。
    run()方法定義了該線程的操作和功能。運行狀態中的線程執行自己的run方法中的代碼,直到調用其它方法或者發生阻塞而終止。

  • (4)阻塞狀態
    一個正在執行的線程在某些特殊情況下,如被人爲掛起或需要執行耗時的輸入輸出操作時,將讓出CPU並暫時中止自己的執行,進入堵塞狀態。

在可執行狀態下,如果調用sleep()、suspend()、wait()等方法,線程都將進入阻塞狀態。
堵塞時,線程不能進入排隊隊列,只能當引起阻塞的原因被消除後,線程轉入就緒狀態,重新到就緒隊列中排隊等待,這時被CPU調度選中後會從原來停止的位置開始繼續執行。

記住:阻塞被消除後是回到就緒狀態,不是運行狀態。

  • (5)死亡狀態
    線程調用stop()方法,destory()方法或run()方法執行結束後,線程即處於死亡狀態。
    處於死亡狀態的線程不具有繼續運行的能力。可以通過getState()方法來獲取線程當前的狀態。

有的還有個超時等待
處於這種狀態的線程不會被分配CPU執行時間,不過無須無限期的等待被其它線程顯式的喚醒,在達到一定時間之後它們會自動喚醒。

3 常見問題

  • (1) 造成線程阻塞的方法?
    阻塞線程的方法:join、yield、sleep和Object的wait()方法

  • (2) Java的守護進程(後臺進程)?
    設置線程爲後臺進程運行,setDaemon(true)。如果一個進程中只有後臺線程在運行,這個進程就會結束。

  • (3)造成線程阻塞後,線程回到了哪個狀態了?
    通過join、yield、sleep造成線程阻塞後是回到了就緒狀態。

  • (4)哪些狀態之後是回到了就緒狀態?
    a)通過join、yield、sleep造成線程阻塞後是回到了就緒狀態
    b)遇到synchronized後
    c)遇到Object的等待wait方法後

  • (5)sleep 會釋放鎖嗎?
    sleep不會釋放鎖【它會抱着鎖睡覺】

  • (6) 線程都有哪些狀態?具體是怎麼運行的
    線程有:創建、就緒、運行、阻塞、終止 五種狀態。
    a)調用new關鍵字創建後,進入到新生狀態
    b)調用start後進入就緒狀態
    c)CPU調度到本線程後,本線程開始執行,進入到運行狀態
    d)運行中遇到join,yield,sleep造成阻塞,進入阻塞狀態。阻塞完成後,又回到就緒狀態
    e)線程正常執行完,或者遇到異常終止後,進入死亡狀態。

  • (7) 終止線程有哪幾種方法?
    線程調用stop()方法, destory()方法或run()方法執行結束後,線程即處於死亡的狀態。
    處於死亡狀態的線程不再具有繼續運行的能力。
    推薦使用boolen標識來停止線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章