線程調度和yeild()

1.調用線程的yeild()方法,只會使與當前線程相同優先級的線程獲得運行機會
注:是當前線程退出時間片(當多個線程在執行的時候,系統會爲每個線程分配時間片,當這個時間片用完後,這個線程暫不執行,轉到下一個線程,再給該線程分配時間片,在執行)
yelid,當代碼執行到這時即使時間片沒有用完,也退出當前線程,轉到下一線程


2.線程調度、、、、、、、、、


計算機通常只有1個CPU,在任意時刻只執行一條機器指令,內個線程只有獲得CPU的使用權才能執行指令,所謂的多線程的併發運行,其實是指從宏觀上看,各個線程輪流獲得CPU的使用權,分別執行各自的任務。在運行池中,會有多個處於就緒狀態的線程在等待CPU,JAVA虛擬機的一項任務就是負責線程的調度,線程調度是指按照特定機制爲多個線程分配CPU的使用權.


兩種調度方式:
有兩種調度模型:分時調度模型和搶佔式調度模型。
分時調度模型是指讓所有的線程輪流獲得cpu的使用權,並且平均分配每個線程佔用的CPU的時間片這個也比較好理解。
java虛擬機採用搶佔式調度模型,是指優先讓可運行池中優先級高的線程佔用CPU,如果可運行池中的線程優先級相同,那麼就隨機選擇一個線程,使其佔用CPU。處於運行狀態的線程會一直運行,直至它不得不放棄CPU。


放棄CPU 的原因
1 java虛擬機讓當前線程暫時放棄CPU,轉到就緒狀態,使其它線程獲得運行機會。
2 當前線程因爲某些原因而進入阻塞狀態
3 線程結束運行
需要注意的是,線程的調度不是跨平臺的,它 不僅僅取決於java虛擬機,還依賴於操作系統。在某些操作系統中,只要運行中的線程沒有遇到阻塞,就不會放棄CPU;在某些操作系統中,即使線程沒有遇到阻塞,也會運行一段時間後放棄CPU,給其它線程運行的機會。
java的線程調度是不分時的,同時啓動多個線程後,不能保證各個線程輪流獲得均等的CPU時間片。
如果希望明確地讓一個線程給另外一個線程運行的機會,可以採取以下辦法之一。
調整各個線程的優先級
讓處於運行狀態的線程調用Thread.sleep()方法
讓處於運行狀態的線程調用Thread.yield()方法
讓處於運行狀態的線程調用另一個線程的join()方法
線程切換:不是所有的線程切換都需要進入內核模式
發佈了57 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章