java線程的生命週期

當線程被創建並啓動之後,它既不是一啓動就進入執行狀態,也不是一直處於執行狀態,在其生命週期中,要經過“新建(New)”、“就緒(Runnable)”、“運行(Running')”、“阻塞(Blocked)”和“死亡(Dead)”五種狀態。線程在創建之後,不可能一直霸佔着CPU獨立運行,需要在多個線程之間切換,所以大部分時間處於運行、阻塞之間切換。

一、新建和就緒狀態

(1)、當用new關鍵字創建一個線程的時候,該線程就處於新建狀態;

(2)、調用start()方法之後,線程就進入了就緒狀態。當不能立刻進入運行狀態,要等待JVM裏線程調度器的調度。

注意:只能對處於新建狀態的線程調用start()方法,否則會引發異常。

二、運行和阻塞狀態

(1)、如果處於就緒狀態的線程獲得了CPU,就開始執行run方法,處於了運行狀態。當分配的時間用完後,又進入了就緒狀態,等待下次分配到CPU在進入運行狀態。

(2)、遇到以下幾種情況,線程會進入阻塞狀態:

1)、線程調用sleep()方法主動放棄所佔用的處理器資源

2)、線程調用了一個阻塞式IO方法,在該方法返回之時,該線程被阻塞

3)、線程試圖獲得一個同步監視器,但該同步監視器正被其他線程所持有。

4)、現成在等待某個通知(notify)

5)、線程調用了線程的suspend()方法將該線程掛起。該方法容易造成死鎖,應儘量避免使用該方法。

進入阻塞狀態的程序遇到以下情況才能恢復進入就緒狀態,等待分配到資源進入運行狀態:

1)、調用sleep()方法的線程經過了指定時間。

2)、線程調用的阻塞式IO方法已經返回

3)、線程成功的獲得了試圖取得的同步監視器

4)、線程正在等待的某個通知時,其他線程發出了一個通知(signal)

5)、處於掛起狀態的線程被調用了resume()恢復方法

三、線程死亡

(1)、run()或call()方法執行完成,線程正常結束;

(2)、線程拋出一個未捕獲的Exception或Error;

(3)、直接調用該線程的stop()方法來結束該線程———該方法容易導致死鎖,不推薦。

注意:當主線程結束時,其他線程不收任何影響,並不會隨之結束。一旦子線程啓動起來後,他就擁有和主線程相同的地位,他不會受主線程的影響。

爲了測試某個線程是否已經死亡,可以調用線程對象的isAlive方法,當線程處於就緒、運行、阻塞3中狀態是,該方法返回true;當線程處於新建、死亡2種狀態時,該方法將返回false。

注意:不要試圖對一個已經死亡的線程調用start()方法使它重新啓動,該線程不可再次作爲線程執行。start方法只能對處於新建狀態的線程多使用,且只能使用一次!

出處:http://blog.csdn.net/cl05300629/article/details/12999399 作者:佇望碧落

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章