【Java多線程系列】實現與應用(3)線程的優先級

本篇屬于【Java多線程系列】文章第二章【多線程編程的實現與應用】的第三小節內容,我們會來學習線程的優先級概念。

線程的調度

在學習的優先級概念前,我們先要了解Java的線程調度系統。在Java中主要有兩種主要的調度方式 :

(1)協同式線程調度(Cooperative )?

(2)搶占式線程調度(PreemptiveThreads-Scheduling)

協同式線程調度

使用協同式調度的多線程系統,線程的執行時間由線程本身來控制,線程把自己的工作執行完了之后,要主動通知系統切換到另外一個線程上。

協同式多線程的最大好處是實現簡單,而且由于線程要把自己的事情干完后才會進行線程切換,切換操作對線程自己是可知的,所以沒有什么線程同步的問題。Lua語言中的“協同例程”就是這類實現。

它的壞處也很明顯:線程執行時間不可控制,甚至如果一個線程編寫的問題,一直不告知系統進行線程切換,那么程序就會一直阻塞在那里。很久以前的Windows3.x系統就是使用協同式來實現多線程多任務的,相當不穩定,一個進程堅持不讓出CPU執行時間就可能會導致整個系統崩潰。

搶占式線程調度

搶占式調度的多線程系統,那么每個線程將由系統來分配執行時間,線程的切換不由線程本身來決定(在Java中,Thread.yield()可以讓出執行時間,但是要獲取執行時間的話,線程本身是沒有什么辦法的)。

在這種實現線程調度的方式下,線程的執行時間是系統可控的,也不會有一個線程導致整個進程阻塞的問題,Java使用的線程調度方式就是搶占式調度。與前面所說的Windows3.x的例子相對,在Windows9x/NT內核中就是使用搶占式來實現多進程的,當一個進程除了問題,我們還可以使用任務管理器把這個進程殺掉,而不至于導致系統崩潰。

雖然Java線程調度是系統自動完成的,但是我們還是可以“建議”系統給默寫線程多分配一點執行時間,另外的一些線程則可以少分配一點,這項操作可以通過設置線程優先級來完成。Java語言一共設置了10個級別的線程優先級(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),這兩個線程同時處于Ready狀態時,優先級越高的線程越容易被系統選擇執行。

線程的優先級

線程的優先級代表該線程的重要程度。如果有大量線程都被堵塞,都在等候運行,會盡可能地運行優先級比較的線程。

但這并不表示優先級較低的線程不會運行。若程序的優先級較低,只不過表示它被允許執行的機會小一些而已。

Thread.currentThread().getPriority()?//獲得當前線程的優先級

public final void setPriority(int newPriority) //設置線程的優先級

線程的優先級設置可以為1-10的任一數值, Thread類中定義了三個線程優先級, 分別是:MIN_PRIORITY(1)、NORM_PRIORITY(5)、MAX_PRIORITY(10), 一般情況下推薦使用這幾個常量, 不要自行設置數值。

不同平臺, 對線程的優先級的支持不同,編程的時候不要過度依賴線程優先級。程序的運行順序不能完全依賴于設置的優先級順序。

本文系【程序因子】版權作品,未經授權嚴禁轉載,同時也歡關注同名公眾號【程序因子】迎投稿及合作。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容

  • 作者:楊興強原文來源:開點工作室(ID:kaidiancs) 一.從一個例子開始 看著Java線程執行起來的那種任...
    開點工作室閱讀 6,805評論 2 28
  • 本文主要講了java中多線程的使用方法、線程同步、線程數據傳遞、線程狀態及相應的一些線程函數用法、概述等。 首先講...
    李欣陽閱讀 2,493評論 1 15
  • Java多線程學習 [-] 一擴展javalangThread類 二實現javalangRunnable接口 三T...
    影馳閱讀 2,987評論 1 18
  • 除了充分利用計算機處理器的能力外,一個服務端同時對多個客戶端提供服務則是另一個更具體的并發應用場景。衡量一個服務性...
    胡二囧閱讀 1,383評論 0 12
  • 一、認識多任務、多進程、單線程、多線程 要認識多線程就要從操作系統的原理說起。 以前古老的DOS操作系統(V 6....
    GT921閱讀 1,025評論 0 3