1. 程式人生 > >Java執行緒優先順序

Java執行緒優先順序

前言

 在作業系統中,執行緒可以劃分優先順序,優先順序較高的得到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都是先執行完.