更新時間:2017年11月14日16時07分 來源:傳智播客 瀏覽次數(shù):
程序中的多線程是并發(fā)執(zhí)行的,但這只是宏觀現(xiàn)象。對于大多數(shù)計算機而言,CPU只有一個,在某個特定的時刻只能執(zhí)行一條機器指令,多線程的每個線程只有得到CPU的使用權(quán)才能執(zhí)行指令。Java虛擬機按照特定機制為多個線程分配CPU的使用權(quán)就是線程的調(diào)度。
在計算機中,CPU的調(diào)度有兩種調(diào)度模型,分別是分時調(diào)度模型和搶占式調(diào)度模型。所謂分時調(diào)度模型是指讓所有的線程輪流獲得CPU的使用權(quán),并且平均分配每個線程占用的CPU的時間片。而搶占式調(diào)度模型是指優(yōu)先讓可運行池中優(yōu)先級高的線程占用CPU,如果可運行池中的線程優(yōu)先級相同,那么就隨機選擇一個線程,使其占用CPU。處于運行狀態(tài)的線程會一直運行,直至它不得不放棄CPU。Java虛擬機采用的就是搶占式調(diào)度模型,這種默認(rèn)的方式在很多時候都是適用的,程序員不需要去關(guān)心它,但有時候需要改變這種分配的模式,這時則需要控制CPU的調(diào)度。JDK中提供了一系列的方法用于控制線程的調(diào)度。
線程的優(yōu)先級
在線程中有優(yōu)先級的機制,線程的優(yōu)先級用1~10之間的整數(shù)來表示,數(shù)字越大則表示優(yōu)先級越高。除了數(shù)字,還可以使用Thread類中提供的三個靜態(tài)常量表示線程的優(yōu)先級,他們分別是:MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORIY。
優(yōu)先級高的線程獲得CPU執(zhí)行的機會越大,而優(yōu)先級低的線程獲得CPU執(zhí)行的機會越小。在默認(rèn)情況下,每個線程都有自己的優(yōu)先級,例如main線程具有普通優(yōu)先級。線程優(yōu)先級不是固定不變的,通過調(diào)用Thread類的setPriority(int newPriority)方法可以進行改變,setPriority()方法的數(shù)newPriority接收1~10之間的數(shù)或者Thread類的三個靜態(tài)常量,代碼如下所示:
class MaxPriority implements Runnable {
publicvoid run() {
for(int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()
+":優(yōu)先級為高,循環(huán)變量為" + i);
}
}
}
class MinPriority implements Runnable {
publicvoid run() {
for(int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()
+":優(yōu)先級為低,循環(huán)變量為" + i);
}
}
}
public class Example06 {
publicstatic void main(String[] args) {
ThreadminPriority = new Thread(new MinPriority());
ThreadmaxPriority = new Thread(new MaxPriority());
minPriority.setPriority(Thread.MIN_PRIORITY);
maxPriority.setPriority(10);
minPriority.start();
maxPriority.start();
}
}
運行結(jié)果為:
Thread-1:優(yōu)先級為高,循環(huán)變量為0
Thread-1:優(yōu)先級為高,循環(huán)變量為1
Thread-1:優(yōu)先級為高,循環(huán)變量為2
Thread-0:優(yōu)先級為低,循環(huán)變量為0
Thread-0:優(yōu)先級為低,循環(huán)變量為1
Thread-0:優(yōu)先級為低,循環(huán)變量為2
在程序中創(chuàng)建了兩個線程minPriority和maxPriority,分別將線程的優(yōu)先級設(shè)置為1和10,從運行結(jié)果可以看出優(yōu)先級高的maxPriority線程先運行完畢后優(yōu)先級低的minPriority線程才開始運行。
雖然Java中提供了10個線程優(yōu)先級,但這些優(yōu)先級需要操作系統(tǒng)的支持,然而,不同的操作系統(tǒng)支持的優(yōu)先級并不相同,不能很好的和Java中線程優(yōu)先級一一對應(yīng),因此,在設(shè)計多線程應(yīng)用程序時,其功能的實現(xiàn)一定不能依賴于線程的優(yōu)先級,而只能把線程優(yōu)先級作為一種提高程序效率的手段。友情提示:獲得更多學(xué)科學(xué)習(xí)視頻+資料+源碼,請加QQ:3276250747。