Java執行緒優先順序
阿新 • • 發佈:2019-01-30
前言
在作業系統中,執行緒可以劃分優先順序,優先順序較高的得到CPU的資源越多,也就是CPU先執行優先順序較高的執行緒物件中的任務.
在Java中,執行緒的優先順序分為1-10個等級,數字越大,優先順序越高.如果不在這個範圍內,則會丟擲IllegalArgumentException異常.
Java優先順序具有繼承性,子執行緒會獲得和父執行緒同樣的優先順序等級.
執行緒的優先順序高度依賴系統,當虛擬機器依賴於宿主平臺的執行緒實現機制時,Java的執行緒優先順序被對映到宿主平臺的優先順序等級中.優先順序個數可能更多,也可能更少.
Java中的優先順序
Java中的優先順序定義在java.lang.Thread中
//優先順序屬性
private int priority;
//最小的優先順序等級
public static final int MIN_PRIORITY = 1;
//預設的優先順序等級
public static final int NORM_PRIORITY = 5;
//最大的優先順序等級
public static final int MAX_PRIORITY = 10;
設定優先順序等級,最後呼叫的是c/c++編寫的底層函式,應該是對映到作業系統的優先順序等級.
public final void setPriority(int newPriority) {
ThreadGroup g;
checkAccess();
if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
throw new IllegalArgumentException();
}
if((g = getThreadGroup()) != null) {
if (newPriority > g.getMaxPriority()) {
newPriority = g.getMaxPriority();
}
//呼叫的是c/c++編寫的底層函式
setPriority0(priority = newPriority);
}
}
例項
package org.prior;
public class Prior {
public static void main(String[] args) {
System.out.println("執行緒優先順序測試");
PriorThread1 th1 = new PriorThread1();
PriorThread2 th2 = new PriorThread2();
//執行緒th1的優先順序較低
th1.setPriority(5);
th2.setPriority(6);
th1.start();
th2.start();
}
}
class PriorThread1 extends Thread {
@Override
public void run() {
for(int i = 0;i < 50 ;i++ ) {
System.out.print(Thread.currentThread().getName() + " " + i + "\t");
if(i % 10 == 0 ) {
System.out.println();
}
}
}
}
class PriorThread2 extends Thread{
@Override
public void run() {
for(int i = 0;i < 50 ;i++ ) {
System.out.print(Thread.currentThread().getName() + " " + i + "\t");
if(i % 10 == 0 ) {
System.out.println();
}
}
}
}
測試結果
執行緒優先順序測試
Thread-0 0
Thread-1 0 Thread-0 1 Thread-0 2 Thread-0 3
Thread-0 4 Thread-1 1 Thread-1 2 Thread-1 3 Thread-1 4 Thread-1 5 Thread-1 6 Thread-1 7 Thread-1 8 Thread-0 5 Thread-1 9 Thread-0 6 Thread-0 7 Thread-0 8 Thread-0 9 Thread-1 10
Thread-1 11 Thread-1 12 Thread-1 13 Thread-1 14 Thread-1 15 Thread-1 16 Thread-1 17 Thread-1 18 Thread-1 19 Thread-1 20
Thread-1 21 Thread-1 22 Thread-1 23 Thread-1 24 Thread-1 25 Thread-1 26 Thread-1 27 Thread-1 28 Thread-1 29 Thread-1 30
Thread-1 31 Thread-1 32 Thread-1 33 Thread-1 34 Thread-1 35 Thread-1 36 Thread-1 37 Thread-1 38 Thread-1 39 Thread-1 40
Thread-1 41 Thread-1 42 Thread-1 43 Thread-1 44 Thread-1 45 Thread-1 46 Thread-1 47 Thread-1 48 Thread-1 49 Thread-0 10
Thread-0 11 Thread-0 12 Thread-0 13 Thread-0 14 Thread-0 15 Thread-0 16 Thread-0 17 Thread-0 18 Thread-0 19 Thread-0 20
Thread-0 21 Thread-0 22 Thread-0 23 Thread-0 24 Thread-0 25 Thread-0 26 Thread-0 27 Thread-0 28 Thread-0 29 Thread-0 30
Thread-0 31 Thread-0 32 Thread-0 33 Thread-0 34 Thread-0 35 Thread-0 36 Thread-0 37 Thread-0 38 Thread-0 39 Thread-0 40
Thread-0 41 Thread-0 42 Thread-0 43 Thread-0 44 Thread-0 45 Thread-0 46 Thread-0 47 Thread-0 48 Thread-0 49
Thread-0的優先順序比Thread-1的優先順序低,因此Thread-1獲得的執行機會是比較高的,在多次測試過程中,Thread-1都是先執行完.