執行緒的狀態轉換

2021-10-14 11:04:28 字數 2484 閱讀 4243

注:拿到物件的鎖標記,即為獲得了對該物件(臨界區)的使用許可權。即該執行緒獲得了執行所需的資源,進入「就緒狀態」,只需獲得cpu,就可以執行。因為當呼叫wait()後,執行緒會釋放掉它所占有的「鎖標誌」,所以執行緒只有在此獲取資源才能進入就緒狀態。

停止執行緒(flag標誌):

不推薦使用jdk提供的stop(),destory()方法

推薦執行緒自己停止下來

推薦使用乙個標誌位進行終止變數當flag==false則終止執行緒執行

執行緒休眠(sleep):每乙個物件都有乙個鎖,sleep不會釋放鎖

執行緒禮讓(yield):

讓當前正在執行的執行緒暫停,但不阻塞

將執行緒從執行狀態轉為就緒狀態

讓cpu重新排程,禮讓不一定成功

執行緒強制執行(join):在此執行緒執行完成後,再執行其他執行緒,其他執行緒阻塞

public class test implements  runnable

}public static void main(string args) throws interruptedexception

system.out.println("main"+i);}}

}

下面是執行緒狀態變換的解釋:

1、當我們new了這個物件後,執行緒就進入了初始狀態;

2、當該物件呼叫了start()方法,就進入就緒狀態;

3、進入就緒後,當該物件被作業系統選中,獲得cpu時間片就會進入執行狀態;

4、進入執行狀態後情況就比較複雜了

4.1、run()方法或main()方法結束後,執行緒就進入終止狀態;

4.2、當執行緒呼叫了自身的sleep()方法或其他執行緒的join()方法,程序讓出cpu,然後就會進入阻塞狀態(該狀態既停止當前執行緒,但並不釋放所占有的資源即呼叫sleep ()函式後,執行緒不會釋放它的「鎖標誌」。)。當sleep()結束或join()結束後,該執行緒進入可執行狀態,繼續等待os分配cpu時間片。典型地,sleep()被用在等待某個資源就緒的情形:測試發現條件不滿足後,讓執行緒阻塞一段時間後重新測試,直到條件滿足為止。

4.3、執行緒呼叫了yield()方法,意思是放棄當前獲得的cpu時間片,回到就緒狀態,這時與其他程序處於同等競爭狀態,os有可能會接著又讓這個程序進入執行狀態; 呼叫 yield() 的效果等價於排程程式認為該執行緒已執行了足夠的時間片從而需要轉到另乙個執行緒。yield()只是使當前執行緒重新回到可執行狀態,所以執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行。

4.4、當執行緒剛進入可執行狀態(注意,還沒執行),發現將要呼叫的資源被synchroniza(同步),獲取不到鎖標記,將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他執行緒在等待獲取鎖標記,這時它們處於佇列狀態,既先到先得),一旦執行緒獲得鎖標記後,就轉入就緒狀態,等待os分配cpu時間片;

4.5.suspend() 和 resume()方法:兩個方法配套使用,suspend()使得執行緒進入阻塞狀態,並且不會自動恢復,必須其對應的resume()被呼叫,才能使得執行緒重新進入可執行狀態。典型地,suspend()和 resume() 被用在等待另乙個執行緒產生的結果的情形:測試發現結果還沒有產生後,讓執行緒阻塞,另乙個執行緒產生了結果後,呼叫 resume()使其恢復。

4.6、wait()和 notify() 方法:當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyall()方法才能被喚醒(由於notify()只是喚醒乙個執行緒,但我們由不能確定具體喚醒的是哪乙個執行緒,也許我們需要喚醒的執行緒不能夠被喚醒,因此在實際使用時,一般都用notifyall()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池,等待獲取鎖標記。

wait() 使得執行緒進入阻塞狀態,它有兩種形式:

一種允許指定以毫秒為單位的一段時間作為引數;另一種沒有引數。前者當對應的 notify()被呼叫或者超出指定時間時執行緒重新進入可執行狀態即就緒狀態,後者則必須對應的 notify()被呼叫。當呼叫wait()後,執行緒會釋放掉它所占有的「鎖標誌」,從而使執行緒所在物件中的其它synchronized資料可被別的執行緒使用。wait()和notify()因為會對物件的「鎖標誌」進行操作,所以它們必須在synchronized函式或synchronizedblock中進行呼叫。如果在non-synchronized函式或non-synchronizedblock中進行呼叫,雖然能編譯通過,但在執行時會發生illegalmonitorstateexception的異常。

執行緒的狀態轉換

執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。對於執行緒的阻止,考慮一下三個方面,不考慮io阻塞的情況 1.睡眠 2.等待 3.因為需要乙個物件的鎖定而被阻塞。睡眠 thread.sleep long millis 和thread.slee...

執行緒的狀態轉換

從執行緒被建立到執行完畢共經過了五個階段 新建 可執行 執行 等待 阻塞 睡眠 終止。關係圖如下所示 新狀態 new 執行緒以建立,但未呼叫任何方法 可執行狀態 runnable 已呼叫start 方法,進入就緒狀態,或程式剛從等待 阻塞 睡眠狀態回來,等待執行 執行狀態 run 程式在正常執行 等...

執行緒的狀態轉換

執行緒的狀態有 new runnable running waiting timed waiting blocked dead 當執行new thread runnabler 後,新建立出來的執行緒處於new狀態,這種執行緒不可能執行 當執行thread.start 後,執行緒處於runnable狀...