首頁技術(shù)文章正文

Java基礎(chǔ)教程:多線程(5)-----線程的調(diào)度之優(yōu)先級(jí)

更新時(shí)間:2017-11-14 來源:黑馬程序員 瀏覽量:

程序中的多線程是并發(fā)執(zhí)行的,但這只是宏觀現(xiàn)象。對(duì)于大多數(shù)計(jì)算機(jī)而言,CPU只有一個(gè),在某個(gè)特定的時(shí)刻只能執(zhí)行一條機(jī)器指令,多線程的每個(gè)線程只有得到CPU的使用權(quán)才能執(zhí)行指令。Java虛擬機(jī)按照特定機(jī)制為多個(gè)線程分配CPU的使用權(quán)就是線程的調(diào)度。

在計(jì)算機(jī)中,CPU的調(diào)度有兩種調(diào)度模型,分別是分時(shí)調(diào)度模型和搶占式調(diào)度模型。所謂分時(shí)調(diào)度模型是指讓所有的線程輪流獲得CPU的使用權(quán),并且平均分配每個(gè)線程占用的CPU的時(shí)間片。而搶占式調(diào)度模型是指優(yōu)先讓可運(yùn)行池中優(yōu)先級(jí)高的線程占用CPU,如果可運(yùn)行池中的線程優(yōu)先級(jí)相同,那么就隨機(jī)選擇一個(gè)線程,使其占用CPU。處于運(yùn)行狀態(tài)的線程會(huì)一直運(yùn)行,直至它不得不放棄CPU。Java虛擬機(jī)采用的就是搶占式調(diào)度模型,這種默認(rèn)的方式在很多時(shí)候都是適用的,程序員不需要去關(guān)心它,但有時(shí)候需要改變這種分配的模式,這時(shí)則需要控制CPU的調(diào)度。JDK中提供了一系列的方法用于控制線程的調(diào)度。

1569029705460_Java多線程.jpg

線程的優(yōu)先級(jí)

在線程中有優(yōu)先級(jí)的機(jī)制,線程的優(yōu)先級(jí)用1~10之間的整數(shù)來表示,數(shù)字越大則表示優(yōu)先級(jí)越高。除了數(shù)字,還可以使用Thread類中提供的三個(gè)靜態(tài)常量表示線程的優(yōu)先級(jí),他們分別是:MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORIY。

優(yōu)先級(jí)高的線程獲得CPU執(zhí)行的機(jī)會(huì)越大,而優(yōu)先級(jí)低的線程獲得CPU執(zhí)行的機(jī)會(huì)越小。在默認(rèn)情況下,每個(gè)線程都有自己的優(yōu)先級(jí),例如main線程具有普通優(yōu)先級(jí)。線程優(yōu)先級(jí)不是固定不變的,通過調(diào)用Thread類的setPriority(int newPriority)方法可以進(jìn)行改變,setPriority()方法的數(shù)newPriority接收1~10之間的數(shù)或者Thread類的三個(gè)靜態(tài)常量,代碼如下所示:

class MaxPriority implements Runnable {

publicvoid run() {

for(int i = 0; i < 3; i++) {

System.out.println(Thread.currentThread().getName()

+":優(yōu)先級(jí)為高,循環(huán)變量為" + i);

}

}

}

class MinPriority implements Runnable {

publicvoid run() {

for(int i = 0; i < 3; i++) {

System.out.println(Thread.currentThread().getName()

+":優(yōu)先級(jí)為低,循環(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();

}

}

運(yùn)行結(jié)果為:

Thread-1:優(yōu)先級(jí)為高,循環(huán)變量為0

Thread-1:優(yōu)先級(jí)為高,循環(huán)變量為1

Thread-1:優(yōu)先級(jí)為高,循環(huán)變量為2

Thread-0:優(yōu)先級(jí)為低,循環(huán)變量為0

Thread-0:優(yōu)先級(jí)為低,循環(huán)變量為1

Thread-0:優(yōu)先級(jí)為低,循環(huán)變量為2

在程序中創(chuàng)建了兩個(gè)線程minPriority和maxPriority,分別將線程的優(yōu)先級(jí)設(shè)置為1和10,從運(yùn)行結(jié)果可以看出優(yōu)先級(jí)高的maxPriority線程先運(yùn)行完畢后優(yōu)先級(jí)低的minPriority線程才開始運(yùn)行。

雖然Java中提供了10個(gè)線程優(yōu)先級(jí),但這些優(yōu)先級(jí)需要操作系統(tǒng)的支持,然而,不同的操作系統(tǒng)支持的優(yōu)先級(jí)并不相同,不能很好的和Java中線程優(yōu)先級(jí)一一對(duì)應(yīng),因此,在設(shè)計(jì)多線程應(yīng)用程序時(shí),其功能的實(shí)現(xiàn)一定不能依賴于線程的優(yōu)先級(jí),而只能把線程優(yōu)先級(jí)作為一種提高程序效率的手段。友情提示:獲得更多學(xué)科學(xué)習(xí)視頻+資料+源碼,請(qǐng)加QQ:3276250747。


本文版權(quán)歸黑馬程序員JavaEE學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!


作者:黑馬程序員JavaEE培訓(xùn)學(xué)院


首發(fā):http://java.itheima.com/

相關(guān)推薦:

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!