日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java线程优先级

發(fā)布時間:2025/3/15 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java线程优先级 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

線程優(yōu)先級被線程調(diào)度用來判定何時每個線程允許運(yùn)行。理論上,優(yōu)先級高的線程比優(yōu)先級低的線程獲得更多的CPU時間。實(shí)際上,線程獲得的CPU時間通常由包括優(yōu)先級在內(nèi)的多個因素決定(例如,一個實(shí)行多任務(wù)處理的操作系統(tǒng)如何更有效的利用CPU時間)。

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

理論上,等優(yōu)先級線程有同等的權(quán)利使用CPU。但你必須小心了。記住,Java是被設(shè)計成能在很多環(huán)境下工作的。一些環(huán)境下實(shí)現(xiàn)多任務(wù)處理從本質(zhì)上與其他環(huán)境不同。為安全起見,等優(yōu)先級線程偶爾也受控制。這保證了所有線程在無優(yōu)先級的操作系統(tǒng)下都有機(jī)會運(yùn)行。實(shí)際上,在無優(yōu)先級的環(huán)境下,多數(shù)線程仍然有機(jī)會運(yùn)行,因?yàn)楹芏嗑€程不可避免的會遭遇阻塞,例如等待輸入輸出。遇到這種情形,阻塞的線程掛起,其他線程運(yùn)行。

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

設(shè)置線程的優(yōu)先級,用setPriority()方法,該方法也是Tread 的成員。它的通常形式為:
final void setPriority(int level)

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

你可以通過調(diào)用Thread的getPriority()方法來獲得當(dāng)前的優(yōu)先級設(shè)置。該方法如下:
final int getPriority( )

當(dāng)涉及調(diào)度時,Java的執(zhí)行可以有本質(zhì)上不同的行為。Windows 95/98/NT/2000 的工作或多或少如你所愿。但其他版本可能工作的完全不同。大多數(shù)矛盾發(fā)生在你使用有優(yōu)先級行為的線程,而不是協(xié)同的騰出CPU時間。最安全的辦法是獲得可預(yù)先性的優(yōu)先權(quán),Java獲得跨平臺的線程行為的方法是自動放棄對CPU的控制。

下面的例子闡述了兩個不同優(yōu)先級的線程,運(yùn)行于具有優(yōu)先權(quán)的平臺,這與運(yùn)行于無優(yōu)先級的平臺不同。一個線程通過Thread.NORM_PRIORITY設(shè)置了高于普通優(yōu)先級兩級的級數(shù),另一線程設(shè)置的優(yōu)先級則低于普通級兩級。兩線程被啟動并允許運(yùn)行10秒。每個線程執(zhí)行一個循環(huán),記錄反復(fù)的次數(shù)。10秒后,主線程終止了兩線程。每個線程經(jīng)過循環(huán)的次數(shù)被顯示。
// 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下運(yùn)行的輸出,表明線程確實(shí)上下轉(zhuǎn)換,甚至既不屈從于CPU,也不被輸入輸出阻塞。優(yōu)先級高的線程獲得大約90%的CPU時間。
Low-priority thread: 4408112
High-priority thread: 589626904

當(dāng)然,該程序的精確的輸出結(jié)果依賴于你的CPU的速度和運(yùn)行的其他任務(wù)的數(shù)量。當(dāng)同樣的程序運(yùn)行于無優(yōu)先級的系統(tǒng),將會有不同的結(jié)果。

上述程序還有個值得注意的地方。注意running前的關(guān)鍵字volatile。盡管volatile 在下章會被很仔細(xì)的討論,用在此處以確保running的值在下面的循環(huán)中每次都得到驗(yàn)證。
while (running) {
click++;
}

如果不用volatile,Java可以自由的優(yōu)化循環(huán):running的值被存在CPU的一個寄存器中,
每次重復(fù)不一定需要復(fù)檢。volatile的運(yùn)用阻止了該優(yōu)化,告知Java running可以改變,改變
方式并不以直接代碼形式顯示。

?

1.線程的概念
2.Java線程模型
3.主線程
4.創(chuàng)建線程
5.創(chuàng)建多線程
6.isAlive()和join()的使用
7.線程優(yōu)先級
8.線程同步
9.線程間通信
10.線程死鎖
11.線程的掛起、恢復(fù)和終止

?

總結(jié)

以上是生活随笔為你收集整理的Java线程优先级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。