程序和執行緒的狀態及轉換
阿新 • • 發佈:2019-01-30
執行緒從建立、執行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、執行狀態、阻塞狀態及死亡狀態。
1.新建狀態(New):
當用new操作符建立一個執行緒時, 例如new Thread(r),執行緒還沒有開始執行,此時執行緒處在新建狀態。 當一個執行緒處於新生狀態時,程式還沒有開始執行執行緒中的程式碼
2.就緒狀態(Runnable)
一個新建立的執行緒並不自動開始執行,要執行執行緒,必須呼叫執行緒的start()方法。當執行緒物件呼叫start()方法即啟動了執行緒,start()方法建立執行緒執行的系統資源,並排程執行緒執行run()方法。當start()方法返回後,執行緒就處於就緒狀態。
處於就緒狀態的執行緒並不一定立即執行run()方法,執行緒還必須同其他執行緒競爭CPU時間,只有獲得CPU時間才可以執行執行緒。因為在單CPU的計算機系統中,不可能同時執行多個執行緒,一個時刻僅有一個執行緒處於執行狀態。因此此時可能有多個執行緒處於就緒狀態。對多個處於就緒狀態的執行緒是由Java執行時系統的執行緒排程程式(thread scheduler)來排程的。
3.執行狀態(Running)
當執行緒獲得CPU時間後,它才進入執行狀態,真正開始執行run()方法.
4. 阻塞狀態(Blocked)
執行緒執行過程中,可能由於各種原因進入阻塞狀態:
1>執行緒通過呼叫sleep方法進入睡眠狀態;
2>執行緒呼叫一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的呼叫者;
3>執行緒試圖得到一個鎖,而該鎖正被其他執行緒持有;
4>執行緒在等待某個觸發條件;
......
所謂阻塞狀態是正在執行的執行緒沒有執行結束,暫時讓出CPU,這時其他處於就緒狀態的執行緒就可以獲得CPU時間,進入執行狀態。
5. 死亡狀態(Dead)
有兩個原因會導致執行緒死亡:
1) run方法正常退出而自然死亡,
2) 一個未捕獲的異常終止了run方法而使執行緒猝死。
為了確定執行緒在當前是否存活著(就是要麼是可執行的,要麼是被阻塞了),需要使用isAlive方法。如果是可執行或被阻塞,這個方法返回true; 如果執行緒仍舊是new狀態且不是可執行的, 或者執行緒死亡了,則返回false.
原文來源:http://blog.csdn.net/peter_teng/article/details/10197785
程序:程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位。
程序狀態:一個程序的生命週期可以劃分為一組狀態,這些狀態刻畫了整個程序。程序狀態即體現一個程序的生命狀態。
程序狀態:
一般來說,程序有三個狀態,即就緒狀態,執行狀態,阻塞狀態。
執行態:程序佔用CPU,並在CPU上執行;
就緒態:程序已經具備執行條件,但是CPU還沒有分配過來;
阻塞態:程序因等待某件事發生而暫時不能執行;
下面是3種狀態轉換圖
當然理論上上述三種狀態之間轉換分為六種情況;
執行——>就緒:1,主要是程序佔用CPU的時間過長,而系統分配給該程序佔用CPU的時間是有限的;2,在採用搶先式優先順序排程演算法的系統中,當有更高優先順序的程序要執行時,該程序就被迫讓出CPU,該程序便由執行狀態轉變為就緒狀態。
就緒——>執行:執行的程序的時間片用完,排程就轉到就緒佇列中選擇合適的程序分配CPU
執行——>阻塞:正在執行的程序因發生某等待事件而無法執行,則程序由執行狀態變為阻塞狀態,如發生了I/O請求
阻塞——>就緒:程序所等待的事件已經發生,就進入就緒佇列
以下兩種狀態是不可能發生的:
阻塞——>執行:即使給阻塞程序分配CPU,也無法執行,作業系統在進行排程時不會從阻塞佇列進行挑選,而是從就緒佇列中選取
就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態。
在一些系統中,又增加了一些新狀態,如掛起狀態,可執行狀態,深度睡眠狀態,淺度睡眠狀態,暫停狀態,僵死狀態。
可執行狀態:執行狀態和就緒狀態的合併,表示程序正在執行或準備執行,Linux 中使用TASK_RUNNING 巨集表示可執行狀態。
淺度睡眠狀態:程序正在睡眠(被阻塞),等待資源的到來是喚醒,也可以通過其他程序訊號或時鐘中斷喚醒,進入執行佇列。Linux 中使用TASK_INTERRUPTIBLE 巨集表示此狀態。
深度睡眠狀態:其和淺度睡眠基本類似,但不可被其他程序訊號或時鐘中斷喚醒。Linux 中使用TASK_UNINTERRUPTIBLE 巨集表示此狀態。
暫停狀態:程序暫停執行接受某種處理。Linux 使用TASK_STOPPED 巨集表示此狀態。
僵死狀態:程序已經結束但未釋放程序控制塊(PCB),Linux 使用TASK_ZOMBIE 巨集表示此狀態。
掛起狀態:在執行狀態的程序通過掛起即可進入就緒狀態,如圖所示,就緒狀態和阻塞狀態都分為活動態和靜止態。由活動態向靜止態轉換就是通過掛起實現的。
引入掛起狀態的原因有:
(1) 終端使用者的請求。當終端使用者在自己的程式執行期間發現有可疑問題時,希望暫時使自己的程式靜止下來。亦即,使正在執行的程序暫停執行;若此時使用者程序正處於就緒狀態而未執行,則該程序暫不接受排程,以便使用者研究其執行情況或對程式進行修改。我們把這種靜止狀態稱為掛起狀態。
(2) 父程序請求。有時父程序希望掛起自己的某個子程序,以便考查和修改該子程序,或者協調各子程序間的活動。
(3) 負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的程序掛起,以保證系統能正常執行。
(4) 作業系統的需要。作業系統有時希望掛起某些程序,以便檢查執行中的資源使用情況或進行記賬。
具有掛起狀態的程序狀態轉換圖為:
原文:http://blog.csdn.net/u012824097/article/details/52058395
1.新建狀態(New):
當用new操作符建立一個執行緒時, 例如new Thread(r),執行緒還沒有開始執行,此時執行緒處在新建狀態。 當一個執行緒處於新生狀態時,程式還沒有開始執行執行緒中的程式碼
2.就緒狀態(Runnable)
一個新建立的執行緒並不自動開始執行,要執行執行緒,必須呼叫執行緒的start()方法。當執行緒物件呼叫start()方法即啟動了執行緒,start()方法建立執行緒執行的系統資源,並排程執行緒執行run()方法。當start()方法返回後,執行緒就處於就緒狀態。
處於就緒狀態的執行緒並不一定立即執行run()方法,執行緒還必須同其他執行緒競爭CPU時間,只有獲得CPU時間才可以執行執行緒。因為在單CPU的計算機系統中,不可能同時執行多個執行緒,一個時刻僅有一個執行緒處於執行狀態。因此此時可能有多個執行緒處於就緒狀態。對多個處於就緒狀態的執行緒是由Java執行時系統的執行緒排程程式(thread scheduler)來排程的。
3.執行狀態(Running)
當執行緒獲得CPU時間後,它才進入執行狀態,真正開始執行run()方法.
4. 阻塞狀態(Blocked)
執行緒執行過程中,可能由於各種原因進入阻塞狀態:
1>執行緒通過呼叫sleep方法進入睡眠狀態;
2>執行緒呼叫一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的呼叫者;
3>執行緒試圖得到一個鎖,而該鎖正被其他執行緒持有;
4>執行緒在等待某個觸發條件;
......
所謂阻塞狀態是正在執行的執行緒沒有執行結束,暫時讓出CPU,這時其他處於就緒狀態的執行緒就可以獲得CPU時間,進入執行狀態。
5. 死亡狀態(Dead)
有兩個原因會導致執行緒死亡:
1) run方法正常退出而自然死亡,
2) 一個未捕獲的異常終止了run方法而使執行緒猝死。
為了確定執行緒在當前是否存活著(就是要麼是可執行的,要麼是被阻塞了),需要使用isAlive方法。如果是可執行或被阻塞,這個方法返回true; 如果執行緒仍舊是new狀態且不是可執行的, 或者執行緒死亡了,則返回false.
原文來源:http://blog.csdn.net/peter_teng/article/details/10197785
程序:程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位。
程序狀態:一個程序的生命週期可以劃分為一組狀態,這些狀態刻畫了整個程序。程序狀態即體現一個程序的生命狀態。
程序狀態:
一般來說,程序有三個狀態,即就緒狀態,執行狀態,阻塞狀態。
執行態:程序佔用CPU,並在CPU上執行;
就緒態:程序已經具備執行條件,但是CPU還沒有分配過來;
阻塞態:程序因等待某件事發生而暫時不能執行;
下面是3種狀態轉換圖
當然理論上上述三種狀態之間轉換分為六種情況;
執行——>就緒:1,主要是程序佔用CPU的時間過長,而系統分配給該程序佔用CPU的時間是有限的;2,在採用搶先式優先順序排程演算法的系統中,當有更高優先順序的程序要執行時,該程序就被迫讓出CPU,該程序便由執行狀態轉變為就緒狀態。
就緒——>執行:執行的程序的時間片用完,排程就轉到就緒佇列中選擇合適的程序分配CPU
執行——>阻塞:正在執行的程序因發生某等待事件而無法執行,則程序由執行狀態變為阻塞狀態,如發生了I/O請求
阻塞——>就緒:程序所等待的事件已經發生,就進入就緒佇列
以下兩種狀態是不可能發生的:
阻塞——>執行:即使給阻塞程序分配CPU,也無法執行,作業系統在進行排程時不會從阻塞佇列進行挑選,而是從就緒佇列中選取
就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態。
在一些系統中,又增加了一些新狀態,如掛起狀態,可執行狀態,深度睡眠狀態,淺度睡眠狀態,暫停狀態,僵死狀態。
可執行狀態:執行狀態和就緒狀態的合併,表示程序正在執行或準備執行,Linux 中使用TASK_RUNNING 巨集表示可執行狀態。
淺度睡眠狀態:程序正在睡眠(被阻塞),等待資源的到來是喚醒,也可以通過其他程序訊號或時鐘中斷喚醒,進入執行佇列。Linux 中使用TASK_INTERRUPTIBLE 巨集表示此狀態。
深度睡眠狀態:其和淺度睡眠基本類似,但不可被其他程序訊號或時鐘中斷喚醒。Linux 中使用TASK_UNINTERRUPTIBLE 巨集表示此狀態。
暫停狀態:程序暫停執行接受某種處理。Linux 使用TASK_STOPPED 巨集表示此狀態。
僵死狀態:程序已經結束但未釋放程序控制塊(PCB),Linux 使用TASK_ZOMBIE 巨集表示此狀態。
掛起狀態:在執行狀態的程序通過掛起即可進入就緒狀態,如圖所示,就緒狀態和阻塞狀態都分為活動態和靜止態。由活動態向靜止態轉換就是通過掛起實現的。
引入掛起狀態的原因有:
(1) 終端使用者的請求。當終端使用者在自己的程式執行期間發現有可疑問題時,希望暫時使自己的程式靜止下來。亦即,使正在執行的程序暫停執行;若此時使用者程序正處於就緒狀態而未執行,則該程序暫不接受排程,以便使用者研究其執行情況或對程式進行修改。我們把這種靜止狀態稱為掛起狀態。
(2) 父程序請求。有時父程序希望掛起自己的某個子程序,以便考查和修改該子程序,或者協調各子程序間的活動。
(3) 負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的程序掛起,以保證系統能正常執行。
(4) 作業系統的需要。作業系統有時希望掛起某些程序,以便檢查執行中的資源使用情況或進行記賬。
具有掛起狀態的程序狀態轉換圖為:
原文:http://blog.csdn.net/u012824097/article/details/52058395