1、線程調度算法:
背景:計算機的CPU在任意時刻只能執行一條機器指令,每個線程只有獲得CPU 的使用權才能執行指令。所謂多線程的並發運行,其實是指從宏觀上看,各個線程輪流獲得CPU 的使用權,分別執行各自的任務。在運行池中,會有多個處於就緒狀態的線程在等待CPU,JA VA 虛擬機的一項任務就是負責線程的調度。
線程調度是指按照特定機制為多個線程分配CPU 的使用權。(Java是由JVM中的線程計數器來實現線程調度)
兩種調度模型:
1)分時調度模型:指讓所有的線程輪流獲得cpu 的使用權,並且平均分配每個線程占用的CPU的時間片;
2)Java虛擬機采用搶占式調度模型:指優先讓可運行池中優先級高的線程占用CPU,如果可運行池中的線程優先級相同,那么就隨機選擇一個線程,使其占用CPU。處於運行狀態的線程會一直運行,直至它不得不放棄CPU。
2、調度策略:
線程調度器選擇優先級最高的線程運行,但是,如果發生以下情況,就會終止線程的運行:
1)線程體中調用了yield 方法讓出了對cpu 的占用權利;
2)線程體中調用了sleep 方法使線程進入睡眠狀態;
3)線程由於IO 操作受到阻塞;
4)另外一個更高優先級線程出現;
5)在支持時間片的系統中,該線程的時間片用完。
3、線程調度器(Thread Scheduler)和時間分片(Time Slicing )
1)線程調度器是一個操作系統服務,它負責為Runnable 狀態(就緒狀態)的線程分配CPU 時間。一旦我們創建一個線程並啟動它,它的執行便依賴於線程調度器的實現。
2)時間分片是指將可用的CPU 時間分配給可用的Runnable 線程的過程。分配CPU 時間可以基於線程優先級或者線程等待的時間。
3)線程調度並不受到Java 虛擬機控制,所以由應用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴於線程的優先級)。