【Java多線程系列】實(shí)現(xiàn)與應(yīng)用(3)線程的優(yōu)先級

本篇屬于【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)注同名公眾號【程序因子】迎投稿及合作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:楊興強(qiáng)原文來源:開點(diǎn)工作室(ID:kaidiancs) 一.從一個(gè)例子開始 看著Java線程執(zhí)行起來的那種任...
    開點(diǎn)工作室閱讀 6,898評論 2 28
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽閱讀 2,599評論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,110評論 1 18
  • 除了充分利用計(jì)算機(jī)處理器的能力外,一個(gè)服務(wù)端同時(shí)對多個(gè)客戶端提供服務(wù)則是另一個(gè)更具體的并發(fā)應(yīng)用場景。衡量一個(gè)服務(wù)性...
    胡二囧閱讀 1,461評論 0 12
  • 一、認(rèn)識多任務(wù)、多進(jìn)程、單線程、多線程 要認(rèn)識多線程就要從操作系統(tǒng)的原理說起。 以前古老的DOS操作系統(tǒng)(V 6....
    GT921閱讀 1,094評論 0 3

友情鏈接更多精彩內(nèi)容