本篇屬于【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), 一般情況下推薦使用這幾個常量, 不要自行設置數值。
不同平臺, 對線程的優先級的支持不同,編程的時候不要過度依賴線程優先級。程序的運行順序不能完全依賴于設置的優先級順序。
本文系【程序因子】版權作品,未經授權嚴禁轉載,同時也歡關注同名公眾號【程序因子】迎投稿及合作。