高頻面試題-請說一下線程的生命週期!

這是我參與更文挑戰的第7天,活動詳情查看: 更文挑戰面試

這算是一個關於線程的基礎問題了,可是依然不少面試官仍是會問一下,假若這個問題就卡住了,經過的概率就大打折扣了。markdown

下面一塊兒來看一下吧!post

當一個線程在建立、啓動以後,並非緊接着去執行代碼塊,這其中有一個過程,也就是一個線程開始到結束的一個生命週期了。spa

全網其實有着兩個版本的生命週期解釋,大同小異。線程

五種狀態

一種說法是五種狀態,分別是新建(New)、就緒(Runnable)、運行(Running)、阻塞狀態(Blocked)、線程死亡(Dead)。code

六種狀態

另外一種說法是六種狀態,分別是新建(New)、就緒/運行(Runnable)、結束(Terminated)、阻塞狀態(Blocked)、等待(Waiting)、超時等待(Time_Waiting)。orm

注:這裏的就緒/運行(Runnable),其實就包括了Running運行中狀態和Ready就緒狀態。生命週期

不管是五種仍是六種,其實都很清楚的說明了一個線程從生到死的一個過程,而面試官問出的這個問題固然是不會這麼簡單了,這裏還隱藏着一個更重要的點,那就是這些狀態能夠經過哪些方法進行相互切換,下面接着來看一下吧。get

在這裏我就不說五種狀態的了,由於發現流程圖筆記裏面躺着一個六種狀態的流程圖,今天就着重說一下六種狀態說法下的狀態切換吧。it

先上圖!

1.png

圖例解釋

  1. 線程從New狀態到Runnable狀態,是經過Thread.start()方法進行切換的,這也是線程啓動的第一步。

  2. 從Runnable狀態到Blocked狀態,須要線程執行代碼塊時產生鎖,或者進行IO請求時,線程就會切換成阻塞狀態;當鎖被釋放,或者IO請求完成時,線程就會從Blocked狀態切換回Runnable狀態了。

  3. 從Runnable狀態到Waiting狀態,須要線程代碼塊中調用wait()方法,使當前線程進行等待操做;當調用notify()方法,或者notifyAll()方法時,線程就會從Waiting狀態切換回Runable狀態了。

  4. 從Runnable狀態到Time_Waiting狀態,須要線程代碼塊中調用sleep()方法,由於sleep方法須要傳一個時間的參數,因此這裏一旦執行就會使當前線程進行一段時間的等待;只須要等待時間超時,線程就會從Time_Waiting狀態切換回Runnable狀態了。

  5. 從Runnable狀態到Terminated狀態,是最好理解的,就是代碼執行完成後,就會切換到這個狀態,也預示着這個線程的消亡,而線程一旦執行完成,也就會被線程池收回,或者直接銷燬。

關於線程池的知識,以後能夠細聊一下,今天就到這了,此次的知識雖然基礎,可是同樣重要,不管是面試仍是平常工做都不可或缺,但願你們共同成長,打好基礎。

相關文章
相關標籤/搜索