Java并發(fā)編程:什么是線程優(yōu)先級?
線程優(yōu)先級是操作系統(tǒng)在調(diào)度線程時為每個線程分配的執(zhí)行順序優(yōu)先級。優(yōu)先級較高的線程會先于優(yōu)先級較低的線程執(zhí)行。
在Java中,線程的優(yōu)先級可以設置為1到10之間的值,默認的線程優(yōu)先級是5。
源碼:
圖片
- MIN_PRIORITY:線程的最低優(yōu)先級,值為1。
- NORM_PRIORITY:線程的默認優(yōu)先級,值為5。
- MAX_PRIORITY:線程的最高優(yōu)先級,值為10。
然而,并非所有操作系統(tǒng)都支持10個級別的優(yōu)先級(例如,有些操作系統(tǒng)只支持3個級別:低、中、高)。
Java只是為操作系統(tǒng)提供了一個線程優(yōu)先級的參考值。線程在操作系統(tǒng)中的最終優(yōu)先級仍然由操作系統(tǒng)決定。
線程的執(zhí)行順序最終由操作系統(tǒng)中的調(diào)度器決定,線程的優(yōu)先級肯定是在線程被調(diào)用之前設置的。
一般來說,優(yōu)先級較高的線程比優(yōu)先級較低的線程有更高的機會被執(zhí)行。我們可以使用Thread
類的setPriority()
方法來設置線程的優(yōu)先級。
public class Demo {
public static void main(String[] args) {
Thread a = new Thread();
System.out.println("默認線程優(yōu)先級: " + a.getPriority());
Thread b = new Thread();
b.setPriority(9);
System.out.println("設置線程優(yōu)先級: " + b.getPriority());
}
}
輸出:
默認線程優(yōu)先級: 5
設置線程優(yōu)先級: 9
為什么不推薦使用線程優(yōu)先級?
既然有1到10的級別來設置線程的優(yōu)先級,你可能會問:我可以在業(yè)務代碼中使用這個方法來指定某些線程的執(zhí)行順序嗎?
我的回答是:不行!
Java中的優(yōu)先級并不可靠,在Java程序中設置的線程優(yōu)先級只是對操作系統(tǒng)的一個建議,操作系統(tǒng)不一定會采納。實際的執(zhí)行順序由操作系統(tǒng)的線程調(diào)度算法決定。
讓我們用代碼來驗證一下:
public class TestExecuteOrder {
staticclass MyRunnable implements Runnable {
@Override
public void run() {
System.out.printf("當前執(zhí)行的線程是: %s, 優(yōu)先級: %d%n",
Thread.currentThread().getName(),
Thread.currentThread().getPriority());
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable());
t1.setPriority(1);
Thread t2 = new Thread(new MyRunnable());
t2.setPriority(5);
Thread t3 = new Thread(new MyRunnable());
t3.setPriority(10);
t3.start();
t2.start();
t1.start();
}
}
如果按順序執(zhí)行,這個程序應該按照10、5、1的順序輸出。
但看看某個特定的輸出:
當前執(zhí)行的線程是: Thread-1, 優(yōu)先級: 5
當前執(zhí)行的線程是: Thread-2, 優(yōu)先級: 10
當前執(zhí)行的線程是: Thread-0, 優(yōu)先級: 1
優(yōu)先級為5的線程實際上在優(yōu)先級為10的線程之前輸出了結(jié)果,所以看起來這個優(yōu)先級設置確實不可靠 。
線程優(yōu)先級與線程組優(yōu)先級的關系
在前一篇文章中,我們討論過線程必須存在于一個線程組中。那么,當線程的優(yōu)先級與線程組的優(yōu)先級不同時會發(fā)生什么呢?讓我們用以下代碼來驗證:
public class ThreadGroupOrder {
public static void main(String[] args) {
ThreadGroup myThreadGroup = new ThreadGroup("myThreadGroup");
myThreadGroup.setMaxPriority(6);
Thread myThread = new Thread(myThreadGroup, "myThread");
myThread.setPriority(8);
System.out.println("線程組優(yōu)先級: " + myThreadGroup.getMaxPriority());
System.out.println("線程優(yōu)先級: " + myThread.getPriority());
}
}
輸出:
線程組優(yōu)先級: 6
線程優(yōu)先級: 6
所以,如果線程的優(yōu)先級高于它所在的線程組的優(yōu)先級,那么該線程的優(yōu)先級將失效,并被替換為線程組的最大優(yōu)先級。