當前位置 : IT培訓網 > Java開發 > Java教程 > 如何學習Java線程優先級

如何學習Java線程優先級

時間:2016-08-30 14:20:01??來源:Java培訓網??作者:IT培訓網??已有:名學員訪問該課程
一個優先級高的線程自然比優先級低的線程優先。舉例來說,當低優先級線程正在運行,而一個高優先級的線程被恢復(例如從沉睡中或等待I/O中),它將搶占低優先級線程所使用的CPU。

很多Java學員咨詢,Java線程也有優先級嗎,如何設定Java線程優先級呢,作為Java初學者該如何學習呢,今天達內小編就來給大家詳細介紹下吧!

線程優先級被線程調度用來判定何時每個線程允許運行。理論上,優先級高的線程比優先級低的線程獲得更多的CPU時間。實際上,線程獲得的CPU時間通常由包括優先級在內的多個因素決定(例如,一個實行多任務處理的操作系統如何更有效的利用CPU時間)。

一個優先級高的線程自然比優先級低的線程優先。舉例來說,當低優先級線程正在運行,而一個高優先級的線程被恢復(例如從沉睡中或等待I/O中),它將搶占低優先級線程所使用的CPU。

理論上,等優先級線程有同等的權利使用CPU。但你必須小心了。記住,Java是被設計成能在很多環境下工作的。一些環境下實現多任務處理從本質上與其他環境不同。為安全起見,等優先級線程偶爾也受控制。這保證了所有線程在無優先級的操作系統下都有機會運行。實際上,在無優先級的環境下,多數線程仍然有機會運行,因為很多線程不可避免的會遭遇阻塞,例如等待輸入輸出。遇到這種情形,阻塞的線程掛起,其他線程運行。

但是如果你希望多線程執行的順利的話,最好不要采用這種方法。同樣,有些類型的任務是占CPU的。對于這些支配CPU類型的線程,有時你希望能夠支配它們,以便使其他線程可以運行。

設置線程的優先級,用setPriority()方法,該方法也是Tread 的成員。它的通常形式為:

final void setPriority(int level)

 

這 里 , level 指 定了對所調用的線程的新的優先權的設置。Level的值必須在MIN_PRIORITY到MAX_PRIORITY范圍內。通常,它們的值分別是1和10。要返回一個線程為默認的優先級,指定NORM_PRIORITY,通常值為5。這些優先級在Thread中都被定義為final型變量。

 

你可以通過調用Thread的getPriority()方法來獲得當前的優先級設置。該方法如下:

final int getPriority( )

 

當涉及調度時,Java的執行可以有本質上不同的行為。Windows 95/98/NT/2000 的工作或多或少如你所愿。但其他版本可能工作的完全不同。大多數矛盾發生在你使用有優先級行為的線程,而不是協同的騰出CPU時間。最安全的辦法是獲得可預先性的優先權,Java獲得跨平臺的線程行為的方法是自動放棄對CPU的控制。

下面的例子闡述了兩個不同優先級的線程,運行于具有優先權的平臺,這與運行于無優先級的平臺不同。一個線程通過Thread.NORM_PRIORITY設置了高于普通優先級兩級的級數,另一線程設置的優先級則低于普通級兩級。兩線程被啟動并允許運行10秒。每個線程執行一個循環,記錄反復的次數。10秒后,主線程終止了兩線程。每個線程經過循環的次數被顯示。

// Demonstrate thread priorities.

class clicker implements Runnable {

int click = 0;

Thread t;

private volatile boolean running = true;

public clicker(int p) {

t = new Thread(this);

t.setPriority(p);

}

 

public void run() {

while (running) {

click++;

}

}

 

public void stop() {

running = false;

}

 

public void start() {

t.start();

}

}

 

class HiLoPri {

public static void main(String args[]) {

Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

clicker hi = new clicker(Thread.NORM_PRIORITY + 2);

clicker lo = new clicker(Thread.NORM_PRIORITY - 2);

lo.start();

hi.start();

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

System.out.println("Main thread interrupted.");

}

lo.stop();

hi.stop();

// Wait for child threads to terminate.

try {

hi.t.join();

lo.t.join();

} catch (InterruptedException e) {

System.out.println("InterruptedException caught");

}

 

System.out.println("Low-priority thread: " + lo.click);

System.out.println("High-priority thread: " + hi.click);

}

}

 

該程序在Windows 98下運行的輸出,表明線程確實上下轉換,甚至既不屈從于CPU,也不被輸入輸出阻塞。優先級高的線程獲得大約90%的CPU時間。

Low-priority thread: 4408112

High-priority thread: 589626904

 

當然,該程序的精確的輸出結果依賴于你的CPU的速度和運行的其他任務的數量。當同樣的程序運行于無優先級的系統,將會有不同的結果。

 

上述程序還有個值得注意的地方。注意running前的關鍵字volatile。盡管volatile 在下章會被很仔細的討論,用在此處以確保running的值在下面的循環中每次都得到驗證。

while (running) {

click++;

}

 

如果不用volatile,Java可以自由的優化循環:running的值被存在CPU的一個寄存器中,

每次重復不一定需要復檢。volatile的運用阻止了該優化,告知Java running可以改變,改變

方式并不以直接代碼形式顯示。

 

如果你已經學會了Java線程優先級的知識點,那就可以根據自己的需求,設置線程的優先級,使得線程的運行順序有所不同!如果想要學習更多的知識點,請關注IT培訓網,我們會第一時間為大家分享最新的Java教程。

頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
------分隔線----------------------------
Java教程
1、Java 概述
1.1 Java語言概述
1.2 Java虛擬機以及跨平臺原理
1.3 Java的主要就業方向
1.4 Java的不同版本
1.5 Java開發環境搭建
1.6 第一個Java程序示例
1.7 Java類和對象的概念
1.8 Java類庫及其組織結構
1.9 Java import
2、Java 語法基礎
2.1 Java數據類型以及變量的定義
2.2 Java數據類型轉換
2.3 Java運算符
2.4 Java流程控制
2.5 Java數組的定義和使用
2.6 Java字符串(String)
2.7 Java StringBuffer與StringBuider
2.8 強調一下編程風格
3、Java 類與對象
3.1 Java類的定義及其實例化
3.2 Java訪問修飾符
3.3 Java變量的作用域
3.4 Java this關鍵字詳解
3.5 Java方法重載
3.6 Java類的基本運行順序
3.7 Java包裝類、拆箱和裝箱詳解
3.8 再談Java包
3.9 源文件的聲明規則
4、Java 繼承和多態
4.1 繼承的概念與實現
4.2 Java super關鍵字
4.3 繼承中的方法的覆蓋和重載
4.4 多態和動態綁定
4.5 instanceof 運算符
4.6 多態對象的類型轉換
4.7 Java static關鍵字
4.8 Java final關鍵字
4.9 Java Object類
5、面向對象高級特性
5.1 Java內部類及其實例化
5.2 內部類的分類
5.3 抽象類的概念和使用
5.4 接口的概念和使用
5.5 接口和抽象類的區別
5.6 Java 泛型
5.7 泛型通配符和類型參數的范圍
6、異常處理
6.1 異常處理基礎
6.2 異常類型Java語言中常見的異常類型有哪些
6.3 未被捕獲的異常
6.4 try和catch的使用
6.5 多重catch語句的使用
6.6 try語句的嵌套
6.7 throw:異常的拋出
6.8 throws子句
6.9 finally塊
6.10 Java的內置異常
6.11 創建自己的異常子類
6.12 斷言
7、線程編程
7.1 線程的概念
7.2 Java線程模型
7.3 主線程
7.4 創建線程
7.5 創建多線程
7.6 isAlive()和join()的使用
7.7 線程優先級
7.8 線程同步
7.9 線程間通信
7.10 線程死鎖
7.11 線程的掛起、恢復和終止
8、輸入輸出(IO)操作
8.1 輸入輸出基本概念
8.2 面向字符的輸入流
8.3 面向字符的輸出流
8.4 面向字節的輸入輸出流
8.5 面向字節流的應用
8.6 文件與目錄管理
8.7 文件的隨機讀寫
8.8 文件的壓縮處理
9、常用類庫、向量與哈希
9.1 Java基礎類庫
9.2 Object類
9.3 Java語言包(java.lang)簡介
9.4 日期和時間類
9.5 向量及其應用
9.6 哈希表及其應用
10、圖形界面(GUI)設計
10.1 圖形界面設計基礎
10.2 框架窗口
10.3 標簽、按鈕和按鈕事件
10.4 面板
10.5 布局設計
10.6 文本框和文本區
10.7 文本框和文本區的輸入輸出
10.8 選擇框和單選按鈕
10.9 列表和組合框
10.10 菜單
10.11 對話框
10.12 滾動條
10.13 鼠標事件
10.14 鍵盤事件
11、圖形、圖像與多媒體
11.1 繪圖基礎
11.2 設置字型和顏色
11.3 繪圖模式
11.4 Graphics類的繪圖方法
11.5 Graphics2D類的繪圖方法
11.6 圖像處理基礎
11.7 圖像緩沖技術
11.8 多媒體基礎
12、網絡與數據庫編程
12.1 IP地址和InetAddress類
12.2 統一資源定位符
12.3 套接字(Socket)
12.4 數據庫連接
12.5 幾個重要的類和接口
12.6 數據庫查詢
12.7 數據庫更新
12.8 插入記錄
12.9 修改記錄
12.10 刪除記錄
激情色播