從執行緒被建立到執行完畢共經過了五個階段:新建、可執行、執行、等待/阻塞/睡眠、終止。
關係圖如下所示:
新狀態(new):執行緒以建立,但未呼叫任何方法 ;
可執行狀態(runnable):已呼叫start()方法,進入就緒狀態,或程式剛從等待/阻塞/睡眠狀態回來,等待執行;
執行狀態(run):程式在正常執行;
等待/阻塞/睡眠:程式在執行,但由於無cpu執行時間,因此處於等待狀態。程式沒有終止,需要某一時間的呼叫就可以正常執行;
終止狀態:也稱死亡狀態,程式已終止,無法被再次呼叫,如果繼續使用start()方法,程式會丟擲異常。
執行緒排程:
如:thread.interrupt():中斷執行緒操作;
thread.sleep():使執行緒進入休眠狀態;
thread.yield():是當前正在執行的執行緒進入等待狀態;
thread.join():連線線程
下面來詳細介紹一下這幾種常見方法的使用:
可以用interrupted/或isinterrupted方法測試執行緒是否中斷,若中斷不活動會返回false,二者區別是interrupt方法會清除中斷狀態,isinterrpted不會。
2. thread.sleep()(睡眠):sleep(int i) 使當前正在執行的執行緒暫停執行,i為毫秒值,意為i毫秒後,返回可執行狀態。為了讓其他執行緒繼續執行,不對他們產生影響,所以應放在run()方法中,如:
public void run(){
try{
thread.sleep(1000);//該執行緒休眠1000毫秒
注意:1.執行緒睡眠到期自動甦醒,並返回到可執行狀態,不是執行狀態。sleep()中指定的時間是執行緒不會執行的最短時間。因此,sleep()方法不能保證該執行緒睡眠到期後就開始執行。
2.sleep()是靜態方法,只能控制當前正在執行的執行緒。
3. thread.yield()(暫停):也稱執行緒的讓步。呼叫此方法可暫停當前執行緒執行,把cpu資源讓出來,先讓其他執行緒執行,不轉變為阻塞狀態,其他執行緒執行完畢後,再執行該程式。優點是充分利用cpu資源,常用於編寫多個合作執行緒。
4. thread.join()(連線):呼叫該方法可使當前執行緒結束,等待呼叫該方法的執行緒執行完畢後在繼續執行該執行緒。thread.join(long mills)意為等待呼叫該方法的執行緒結束後,或最多等待mills毫秒後再執行本執行緒。
5. 也可以利用改變執行緒優先順序的方法實現其排程,但這種方法不提倡使用,因為執行緒排程優先順序操作是沒有保障的,不是優先順序高就一定先執行,只是獲得的機會多了一些。只能把執行緒優先順序作用作為一種提高程式效率的方法,但是要保證程式不依賴這種操作。
下面就簡單的說一下優先順序(priority):
優先順序的高低反映出了執行緒的重要或緊急程度,優先順序用1~10表示,10表示優先順序最高,1最低,系統預設的是5
static int max_priority// 執行緒可以具有的最高優先順序。
static int min_priority// 執行緒可以具有的最低優先順序。
static int norm_priority// 分配給執行緒的預設優先順序。
獲得優先順序的方法:public static final int getpriorty()
設定優先順序的方法:public static final int setpriorty(int newpriorty)
執行緒的狀態轉換
執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。對於執行緒的阻止,考慮一下三個方面,不考慮io阻塞的情況 1.睡眠 2.等待 3.因為需要乙個物件的鎖定而被阻塞。睡眠 thread.sleep long millis 和thread.slee...
執行緒的狀態轉換
執行緒的狀態有 new runnable running waiting timed waiting blocked dead 當執行new thread runnabler 後,新建立出來的執行緒處於new狀態,這種執行緒不可能執行 當執行thread.start 後,執行緒處於runnable狀...
執行緒的狀態轉換
注 拿到物件的鎖標記,即為獲得了對該物件 臨界區 的使用許可權。即該執行緒獲得了執行所需的資源,進入 就緒狀態 只需獲得cpu,就可以執行。因為當呼叫wait 後,執行緒會釋放掉它所占有的 鎖標誌 所以執行緒只有在此獲取資源才能進入就緒狀態。停止執行緒 flag標誌 不推薦使用jdk提供的stop ...