執行緒調度

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

簡介

有兩種調度模型:分時調度模型和搶占式調度模型。

分時調度模型是指讓所有的執行緒輪流獲得cpu的使用權,並且平均分配每個執行緒占用的CPU的時間片這個也比較好理解。

java虛擬機採用搶占式調度模型,是指優先讓可運行池中優先權高的執行緒占用CPU,如果可運行池中的執行緒優先權相同,那么就隨機選擇一個執行緒,使其占用CPU。處於運行狀態的執行緒會一直運行,直至它不得不放棄CPU。

放棄CPU原因

一個執行緒會因為以下原因而放棄CPU。

1 java虛擬機讓當前執行緒暫時放棄CPU,轉到就緒狀態,使其它執行緒獲得運行機會。

2 當前執行緒因為某些原因而進入阻塞狀態

3 執行緒結束運行

需要注意的是,執行緒的調度不是跨平台的,它 不僅僅取決於java虛擬機,還依賴於作業系統。在某些作業系統中,只要運行中的執行緒沒有遇到阻塞,就不會放棄CPU;在某些作業系統中,即使執行緒沒有遇到阻塞,也會運行一段時間後放棄CPU,給其它執行緒運行的機會。

java的執行緒調度是不分時的,同時啟動多個執行緒後,不能保證各個執行緒輪流獲得均等的CPU時間片。

如果希望明確地讓一個執行緒給另外一個執行緒運行的機會,可以採取以下辦法之一。

調整各個執行緒的優先權

讓處於運行狀態的執行緒調用Thread.sleep()方法

讓處於運行狀態的執行緒調用Thread.yield()方法

讓處於運行狀態的執行緒調用另一個執行緒的join()方法

執行緒切換:不是所有的執行緒切換都需要進入核心模式

相關詞條

相關搜尋

熱門詞條

聯絡我們