執行緒的五大狀態
執行緒從建立、執行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、執行狀態、阻塞狀態及死亡狀態。
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.
執行緒從建立、執行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、執行狀態、阻塞狀態及死亡狀態。
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.
相關文章
- java執行緒的五大狀態,阻塞狀態詳解Java執行緒
- 執行緒6--執行緒的狀態執行緒
- 執行緒狀態執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java執行緒的狀態Java執行緒
- Java執行緒池中執行緒的狀態簡介Java執行緒
- 執行緒的幾種狀態執行緒
- 多執行緒的執行緒狀態及相關操作執行緒
- 執行緒狀態和鎖執行緒
- 執行緒各種狀態執行緒
- ThreadPollExcutor執行緒池的狀態thread執行緒
- Java 執行緒的5種狀態Java執行緒
- 【Java】執行緒的 6 種狀態Java執行緒
- java執行緒的狀態+鎖分析Java執行緒
- JAVA 執行緒的幾種狀態Java執行緒
- MySQL執行緒狀態詳解MySql執行緒
- Java執行緒狀態轉換Java執行緒
- java--執行緒狀態【轉】Java執行緒
- Mysql複製執行緒狀態MySql執行緒
- 執行緒的幾種狀態總結執行緒
- Memcached 多執行緒和狀態機執行緒
- Java執行緒狀態及切換Java執行緒
- Java執行緒狀態及同步鎖Java執行緒
- java執行緒棧狀態詳解Java執行緒
- jstack判斷執行緒狀態JS執行緒
- 多執行緒-執行緒的狀態轉換圖及常見執行情況執行緒
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- 執行緒的6種狀態以及轉變執行緒
- 執行緒的狀態轉換以及基本操作執行緒
- 【多執行緒與高併發】- 執行緒基礎與狀態執行緒
- 一起分析執行緒的狀態及執行緒通訊機制執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- JAVA 執行緒狀態及轉化(轉)Java執行緒
- 如何使用jstack分析執行緒狀態JS執行緒
- 如何使用 jstack 分析執行緒狀態JS執行緒
- 多執行緒脫離狀態 + 排程執行緒
- 詳解Java執行緒池的ctl(執行緒池控制狀態)【原始碼分析】Java執行緒原始碼