本篇屬于【Java多線程系列】文章第二章【多線程編程的實(shí)現(xiàn)與應(yīng)用】的第三小節(jié)內(nèi)容,我們會(huì)來學(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í)行時(shí)間由線程本身來控制,線程把自己的工作執(zhí)行完了之后,要主動(dòng)通知系統(tǒng)切換到另外一個(gè)線程上。
協(xié)同式多線程的最大好處是實(shí)現(xiàn)簡單,而且由于線程要把自己的事情干完后才會(huì)進(jìn)行線程切換,切換操作對線程自己是可知的,所以沒有什么線程同步的問題。Lua語言中的“協(xié)同例程”就是這類實(shí)現(xiàn)。
它的壞處也很明顯:線程執(zhí)行時(shí)間不可控制,甚至如果一個(gè)線程編寫的問題,一直不告知系統(tǒng)進(jìn)行線程切換,那么程序就會(huì)一直阻塞在那里。很久以前的Windows3.x系統(tǒng)就是使用協(xié)同式來實(shí)現(xiàn)多線程多任務(wù)的,相當(dāng)不穩(wěn)定,一個(gè)進(jìn)程堅(jiān)持不讓出CPU執(zhí)行時(shí)間就可能會(huì)導(dǎo)致整個(gè)系統(tǒng)崩潰。
搶占式線程調(diào)度
搶占式調(diào)度的多線程系統(tǒng),那么每個(gè)線程將由系統(tǒng)來分配執(zhí)行時(shí)間,線程的切換不由線程本身來決定(在Java中,Thread.yield()可以讓出執(zhí)行時(shí)間,但是要獲取執(zhí)行時(shí)間的話,線程本身是沒有什么辦法的)。
在這種實(shí)現(xiàn)線程調(diào)度的方式下,線程的執(zhí)行時(shí)間是系統(tǒng)可控的,也不會(huì)有一個(gè)線程導(dǎo)致整個(gè)進(jìn)程阻塞的問題,Java使用的線程調(diào)度方式就是搶占式調(diào)度。與前面所說的Windows3.x的例子相對,在Windows9x/NT內(nèi)核中就是使用搶占式來實(shí)現(xiàn)多進(jìn)程的,當(dāng)一個(gè)進(jìn)程除了問題,我們還可以使用任務(wù)管理器把這個(gè)進(jìn)程殺掉,而不至于導(dǎo)致系統(tǒng)崩潰。
雖然Java線程調(diào)度是系統(tǒng)自動(dòng)完成的,但是我們還是可以“建議”系統(tǒng)給默寫線程多分配一點(diǎn)執(zhí)行時(shí)間,另外的一些線程則可以少分配一點(diǎn),這項(xiàng)操作可以通過設(shè)置線程優(yōu)先級來完成。Java語言一共設(shè)置了10個(gè)級別的線程優(yōu)先級(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),這兩個(gè)線程同時(shí)處于Ready狀態(tài)時(shí),優(yōu)先級越高的線程越容易被系統(tǒng)選擇執(zhí)行。
線程的優(yōu)先級
線程的優(yōu)先級代表該線程的重要程度。如果有大量線程都被堵塞,都在等候運(yùn)行,會(huì)盡可能地運(yùn)行優(yōu)先級比較的線程。
但這并不表示優(yōu)先級較低的線程不會(huì)運(yùn)行。若程序的優(yōu)先級較低,只不過表示它被允許執(zhí)行的機(jī)會(huì)小一些而已。
Thread.currentThread().getPriority()?//獲得當(dāng)前線程的優(yōu)先級
public final void setPriority(int newPriority) //設(shè)置線程的優(yōu)先級
線程的優(yōu)先級設(shè)置可以為1-10的任一數(shù)值, Thread類中定義了三個(gè)線程優(yōu)先級, 分別是:MIN_PRIORITY(1)、NORM_PRIORITY(5)、MAX_PRIORITY(10), 一般情況下推薦使用這幾個(gè)常量, 不要自行設(shè)置數(shù)值。
不同平臺(tái), 對線程的優(yōu)先級的支持不同,編程的時(shí)候不要過度依賴線程優(yōu)先級。程序的運(yùn)行順序不能完全依賴于設(shè)置的優(yōu)先級順序。
本文系【程序因子】版權(quán)作品,未經(jīng)授權(quán)嚴(yán)禁轉(zhuǎn)載,同時(shí)也歡關(guān)注同名公眾號【程序因子】迎投稿及合作。