線程的生命週期分爲創建(new)、就緒(Runnable)、運行(running)、阻塞(Blocked)、死亡(Dead)五種狀態
創建(new)
在Java程序中創建線程有幾種方法。每個Java程序至少包含一個線程:主線程。其它線程都是通過Thread構造器或實
例化繼承類Thread的類來創建的。在一個線程對新線程的Thread對象調用start()方法之前,這個新線程並沒有真正
開始執行。
一般常用的兩種構造方法:Thread();Thread(Runnable target)
就緒(Runnable)
處於就緒狀態的線程已經具備了運行條件,即已經啓動了start()方法,但還沒有分配到CPU,處於線程就緒隊列,
等待系統爲其分配CPU。這個過程成爲cpu調度,線程對象一旦獲得cpu就會進入運行狀態。
注意:線程一旦被啓動就不能再啓動,即不能再調用start()方法。
運行(running)、阻塞(Blocked)
處於運行狀態的線程開始執行run()方法。在運行狀態中有很多種線程狀態之間切換的情況,所以此狀態也是線程
生命週期中最複雜的一個狀態。
當發生如下情況線程會進入阻塞狀態:
①、線程調用sleep()方法主動放棄所佔用的系統資源
②、線程調用一個阻塞式IO方法,在該方法返回之前,該線程被阻塞
③、線程試圖獲得一個同步監視器,但更改同步監視器正被其他線程所持有
④、線程在等待某個通知(notify())
被阻塞的線程會在如下情況下進入就緒狀態(重新被激活):
①、sleep()方法睡眠時間已到
②、等待的其他線程或程序持有的“鎖”已被釋放
③、正在等待觸發條件的線程,條件得到滿足
④、等待的操作返回的線程,操作正確返回(wait())
死亡(Dead)
正常死亡:當線程的run()方法執行完畢
非正常死亡:被強制終止;線程拋出未捕獲的異常或Error
在這裏說一種線程被強制終止的方法:
在拋出的InterruptedException異常中加上break或return,然後調用interrupt()方法即可
catch (InterruptedException e) {
e.printStackTrace();
break;}