本篇屬于【Java多線程系列】文章第二章【多線程編程的實現(xiàn)與應(yīng)用】的第三小節(jié)內(nèi)容肠牲,我們會來學(xué)習(xí)線程的優(yōu)先級概念违崇。
線程的調(diào)度
在學(xué)習(xí)的優(yōu)先級概念前阿弃,我們先要了解Java的線程調(diào)度系統(tǒng)。在Java中主要有兩種主要的調(diào)度方式 :
(1)協(xié)同式線程調(diào)度(Cooperative )?
(2)搶占式線程調(diào)度(PreemptiveThreads-Scheduling)
協(xié)同式線程調(diào)度
使用協(xié)同式調(diào)度的多線程系統(tǒng)羞延,線程的執(zhí)行時間由線程本身來控制渣淳,線程把自己的工作執(zhí)行完了之后,要主動通知系統(tǒng)切換到另外一個線程上伴箩。
協(xié)同式多線程的最大好處是實現(xiàn)簡單入愧,而且由于線程要把自己的事情干完后才會進行線程切換,切換操作對線程自己是可知的嗤谚,所以沒有什么線程同步的問題棺蛛。Lua語言中的“協(xié)同例程”就是這類實現(xiàn)。
它的壞處也很明顯:線程執(zhí)行時間不可控制巩步,甚至如果一個線程編寫的問題旁赊,一直不告知系統(tǒng)進行線程切換,那么程序就會一直阻塞在那里椅野。很久以前的Windows3.x系統(tǒng)就是使用協(xié)同式來實現(xiàn)多線程多任務(wù)的终畅,相當不穩(wěn)定,一個進程堅持不讓出CPU執(zhí)行時間就可能會導(dǎo)致整個系統(tǒng)崩潰竟闪。
搶占式線程調(diào)度
搶占式調(diào)度的多線程系統(tǒng)声离,那么每個線程將由系統(tǒng)來分配執(zhí)行時間,線程的切換不由線程本身來決定(在Java中瘫怜,Thread.yield()可以讓出執(zhí)行時間术徊,但是要獲取執(zhí)行時間的話,線程本身是沒有什么辦法的)鲸湃。
在這種實現(xiàn)線程調(diào)度的方式下赠涮,線程的執(zhí)行時間是系統(tǒng)可控的,也不會有一個線程導(dǎo)致整個進程阻塞的問題暗挑,Java使用的線程調(diào)度方式就是搶占式調(diào)度笋除。與前面所說的Windows3.x的例子相對,在Windows9x/NT內(nèi)核中就是使用搶占式來實現(xiàn)多進程的炸裆,當一個進程除了問題垃它,我們還可以使用任務(wù)管理器把這個進程殺掉,而不至于導(dǎo)致系統(tǒng)崩潰。
雖然Java線程調(diào)度是系統(tǒng)自動完成的国拇,但是我們還是可以“建議”系統(tǒng)給默寫線程多分配一點執(zhí)行時間洛史,另外的一些線程則可以少分配一點,這項操作可以通過設(shè)置線程優(yōu)先級來完成酱吝。Java語言一共設(shè)置了10個級別的線程優(yōu)先級(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY)也殖,這兩個線程同時處于Ready狀態(tài)時,優(yōu)先級越高的線程越容易被系統(tǒng)選擇執(zhí)行务热。
線程的優(yōu)先級
線程的優(yōu)先級代表該線程的重要程度忆嗜。如果有大量線程都被堵塞,都在等候運行崎岂,會盡可能地運行優(yōu)先級比較的線程捆毫。
但這并不表示優(yōu)先級較低的線程不會運行。若程序的優(yōu)先級較低冲甘,只不過表示它被允許執(zhí)行的機會小一些而已冻璃。
Thread.currentThread().getPriority()?//獲得當前線程的優(yōu)先級
public final void setPriority(int newPriority) //設(shè)置線程的優(yōu)先級
線程的優(yōu)先級設(shè)置可以為1-10的任一數(shù)值, Thread類中定義了三個線程優(yōu)先級, 分別是:MIN_PRIORITY(1)、NORM_PRIORITY(5)损合、MAX_PRIORITY(10), 一般情況下推薦使用這幾個常量, 不要自行設(shè)置數(shù)值省艳。
不同平臺, 對線程的優(yōu)先級的支持不同,編程的時候不要過度依賴線程優(yōu)先級嫁审。程序的運行順序不能完全依賴于設(shè)置的優(yōu)先級順序跋炕。
本文系【程序因子】版權(quán)作品,未經(jīng)授權(quán)嚴禁轉(zhuǎn)載律适,同時也歡關(guān)注同名公眾號【程序因子】迎投稿及合作辐烂。