簡介
有兩種調度模型:分時調度模型和搶占式調度模型。
分時調度模型是指讓所有的執行緒輪流獲得cpu的使用權,並且平均分配每個執行緒占用的CPU的時間片這個也比較好理解。
java虛擬機採用搶占式調度模型,是指優先讓可運行池中優先權高的執行緒占用CPU,如果可運行池中的執行緒優先權相同,那么就隨機選擇一個執行緒,使其占用CPU。處於運行狀態的執行緒會一直運行,直至它不得不放棄CPU。
放棄CPU原因
一個執行緒會因為以下原因而放棄CPU。
1 java虛擬機讓當前執行緒暫時放棄CPU,轉到就緒狀態,使其它執行緒獲得運行機會。
2 當前執行緒因為某些原因而進入阻塞狀態
3 執行緒結束運行
需要注意的是,執行緒的調度不是跨平台的,它 不僅僅取決於java虛擬機,還依賴於作業系統。在某些作業系統中,只要運行中的執行緒沒有遇到阻塞,就不會放棄CPU;在某些作業系統中,即使執行緒沒有遇到阻塞,也會運行一段時間後放棄CPU,給其它執行緒運行的機會。
java的執行緒調度是不分時的,同時啟動多個執行緒後,不能保證各個執行緒輪流獲得均等的CPU時間片。
如果希望明確地讓一個執行緒給另外一個執行緒運行的機會,可以採取以下辦法之一。
調整各個執行緒的優先權
讓處於運行狀態的執行緒調用Thread.sleep()方法
讓處於運行狀態的執行緒調用Thread.yield()方法
讓處於運行狀態的執行緒調用另一個執行緒的join()方法
執行緒切換:不是所有的執行緒切換都需要進入核心模式