1. 程式人生 > >執行緒五種狀態

執行緒五種狀態

執行緒五種狀態

執行緒,有時被稱為輕量程序(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組成。另外,執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中呈現出間斷性。執行緒也有就緒、阻塞和執行三種基本狀態。就緒狀態是指執行緒具備執行的所有條件,邏輯上可以執行,在等待處理機;執行狀態是指執行緒佔有處理機正在執行;阻塞狀態是指執行緒在等待一個事件(如某個訊號量),邏輯上不可執行。每一個程式都至少有一個執行緒,若程式只有一個執行緒,那就是程式本身。

執行緒狀態:

    

執行緒從建立、執行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、執行狀態、阻塞狀態及死亡狀態。


1.新建狀態(New):

       當用new操作符建立一個執行緒時, 例如newThread(r),執行緒還沒有開始執行,此時執行緒處在新建狀態。當一個執行緒處於新生狀態時,程式還沒有開始執行執行緒中的程式碼

2.就緒狀態(Runnable)

        一個新建立的執行緒並不自動開始執行,要執行執行緒,必須呼叫執行緒的start()方法。當執行緒物件呼叫start()方法即啟動了執行緒,start()方法建立執行緒執行的系統資源,並排程執行緒執行run()方法。當start()方法返回後,執行緒就處於就緒狀態。

        處於就緒狀態的執行緒並不一定立即執行run()方法,執行緒還必須同其他執行緒競爭CPU時間,只有獲得CPU時間才可以執行執行緒。因為在單CPU的計算機系統中,不可能同時執行多個執行緒,一個時刻僅有一個執行緒處於執行狀態。因此此時可能有多個執行緒處於就緒狀態。對多個處於就緒狀態的執行緒是由Java執行時系統的執行緒排程程式(thread scheduler)來排程的。

3.執行狀態(Running)

    當就緒狀態的執行緒被呼叫並獲得處理器資源時,執行緒就進入了執行狀態。此時,自動呼叫該執行緒物件的run()方法。

   run()方法定義了該執行緒的操作和功能。執行狀態中的執行緒執行自己的run方法中程式碼。直到呼叫其他方法或者發生阻塞

而終止。

4. 阻塞狀態(Blocked)

     一個正在執行的執行緒在某些特殊情況下,如被人為掛起或需要執行耗時的輸入輸出操作時,將讓出 CPU 並暫時中止自己的執行,進入堵塞狀態。在可執行狀態下,如果呼叫sleep()、suspend()、wait()等方法,執行緒都將進入堵塞狀態。

堵塞時,執行緒不能進入排隊佇列,只有當引起堵塞的原因被消除後,執行緒轉入就緒狀態。重新到就緒佇列中排隊等待,

這時被CPU排程選中後會從原來停止的位置開始繼續執行。

      ......           
      所謂阻塞狀態是正在執行的執行緒沒有執行結束,暫時讓出CPU,這時其他處於就緒狀態的執行緒就可以獲得CPU時間,進入執行狀態。
5. 死亡狀態(Dead)

        有兩個原因會導致執行緒死亡:
        1) run方法正常退出而自然死亡,
        2) 一個未捕獲的異常終止了run方法而使執行緒猝死。
        為了確定執行緒在當前是否存活著(就是要麼是可執行的,要麼是被阻塞了),需要使用isAlive方法。如果是可執行或被阻塞,這個方法返回true; 如果執行緒仍舊是new狀態且不是可執行的, 或者執行緒死亡了,則返回false.