面試官:您知道執行緒的生命週期包括哪幾個階段?
應聘者:
執行緒的生命週期包含5個階段,包括:新建、就緒、執行、阻塞、銷燬。
-
新建:就是剛使用new方法,new出來的執行緒;
-
就緒:就是呼叫的執行緒的start()方法後,這時候執行緒處於等待CPU分配資源階段,誰先搶的CPU資源,誰開始執行;
-
執行:當就緒的執行緒被排程並獲得CPU資源時,便進入執行狀態,run方法定義了執行緒的操作和功能;
-
阻塞:在執行狀態的時候,可能因為某些原因導致執行狀態的執行緒變成了阻塞狀態,比如sleep()、wait()之後執行緒就處於了阻塞狀態,這個時候需要其他機制將處於阻塞狀態的執行緒喚醒,比如呼叫notify或者notifyAll()方法。喚醒的執行緒不會立刻執行run方法,它們要再次等待CPU分配資源進入執行狀態;
-
銷燬:如果執行緒正常執行完畢後或執行緒被提前強制性的終止或出現異常導致結束,那麼執行緒就要被銷燬,釋放資源;
完整的生命週期圖如下:
新建狀態
我們來看下面一段程式碼:
Thread t1 = new Thread();
這裡的建立,僅僅是在JAVA的這種程式語言層面被建立,而在作業系統層面,真正的執行緒還沒有被建立。只有當我們呼叫了 start() 方法之後,該執行緒才會被建立出來,進入Runnable狀態。只有當我們呼叫了 start() 方法之後,該執行緒才會被建立出來
就緒狀態
呼叫start()方法後,JVM 程式會去建立一個新的執行緒,而此執行緒不會馬上被 CPU 排程執行,進入Running狀態,這裡會有一箇中間狀態,就是Runnable狀態,你可以理解為等待被 CPU 排程的狀態
t1.start()
用一張圖表示如下:
那麼處於Runnable狀態的執行緒能發生哪些狀態轉變?
Runnable狀態的執行緒無法直接進入Blocked狀態和Terminated狀態的。只有處在Running狀態的執行緒,換句話說,只有獲得CPU排程執行權的執行緒才有資格進入Blocked狀態和Terminated狀態,Runnable狀態的執行緒要麼能被轉換成Running狀態,要麼被意外終止。
執行狀態
當CPU排程發生,並從任務佇列中選中了某個Runnable執行緒時,該執行緒會進入Running執行狀態,並且開始呼叫run()方法中邏輯程式碼。
那麼處於Running狀態的執行緒能發生哪些狀態轉變?
-
被轉換成Terminated狀態,比如呼叫 stop() 方法;
-
被轉換成Blocked狀態,比如呼叫了sleep, wait 方法被加入 waitSet 中;
-
被轉換成Blocked狀態,如進行 IO 阻塞操作,如查詢資料庫進入阻塞狀態;
-
被轉換成Blocked狀態,比如獲取某個鎖的釋放,而被加入該鎖的阻塞佇列中;
-
該執行緒的時間片用完,CPU 再次排程,進入Runnable狀態;
-
執行緒主動呼叫 yield 方法,讓出 CPU 資源,進入Runnable狀態
阻塞狀態
Blocked狀態的執行緒能夠發生哪些狀態改變?
-
被轉換成Terminated狀態,比如呼叫 stop() 方法,或者是 JVM 意外 Crash;
-
被轉換成Runnable狀態,阻塞時間結束,比如讀取到了資料庫的資料後;
-
完成了指定時間的休眠,進入到Runnable狀態;
-
正在wait中的執行緒,被其他執行緒呼叫notify/notifyAll方法喚醒,進入到Runnable狀態;
-
執行緒獲取到了想要的鎖資源,進入Runnable狀態;
-
執行緒在阻塞狀態下被打斷,如其他執行緒呼叫了interrupt方法,進入到Runnable狀態;
終止狀態
一旦執行緒進入了Terminated狀態,就意味著這個執行緒生命的終結,哪些情況下,執行緒會進入到Terminated狀態呢?
-
執行緒正常執行結束,生命週期結束;
-
執行緒執行過程中出現意外錯誤;
-
JVM 異常結束,所有的執行緒生命週期均被結束。
作者:Java螞蟻
出處:https://www.cnblogs.com/marsitman/p/11228684.html
版權:轉載請在文章明顯位置註明作者及出處。