自學Java基礎系列-線程優先級setPriority

線程調度

線程的調度指的是系統爲線程分配CPU使用權的過程。

線程調度模型包括:

  1. 分時調度:指讓所有的線程輪流獲得cpu的使用權,並且平均分配每個線程佔用的CPU的時間片這個也比較好理解。
  2. 搶佔式調度模型:是指優先讓優先級高的線程優先佔用CPU的執行權,如果線程優先級相同,那麼就隨機選擇一個線程,使其佔用CPU的執行權。
    java虛擬機採用的就是搶佔式調度模型。

設置優先級

通過如下方法對線程的優先級進行獲取和設置操作:

public final void setPriority(int newPriority) // 設置線程的優先級
public final int getPriority() // 獲取線程的優先級

如果沒有給線程設置優先級,那麼此時線程會存在一個默認的優先級值是:5; 我們可以調用setPriority方法設置線程的優先級,這個方法需要一個int類型的值,那麼我們可以爲其

傳遞一個任意int類型的值嗎?

我們可以通過查看源代碼得到這一結論:

 public class Thread implements Runnable { 
        
        // 最大優先級
        public static final int MAX_PRIORITY = 10;
        
        // 最小優先級
        public static final int MIN_PRIORITY = 1;
        
        // 設置優先級
        public final void setPriority(int newPriority) {
            ...
            if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
                throw new IllegalArgumentException();
            }
            ...
        }
        
    }

通過源碼我們查看到可以設置的線程優先級: 1 <= newPriority <= 10

獲取線程優先級代碼實現

Thread的子類

 public class MyThread extends Thread {
    
        /**
         * 該run方法的方法體就代表了線程需要完成的任務,run方法稱之爲線程執行體
         */
        @Override
        public void run() {
            for(int x = 0 ; x < 100 ; x++) {
    
                // 輸出線程名稱以及x的值
                System.out.println(getName() + "=" +  x);
    
            }
        }
    
    }

測試類

 public class ThreadDemo01 {
    
        public static void main(String[] args) {
    
            // 創建MyThread對象以及設置線程名稱
            MyThread t1 = new MyThread() ;
            t1.setName("pbteach-01");
    
            // 創建MyThread對象以及設置線程名稱
            MyThread t2 = new MyThread() ;
            t2.setName("pbteach-02");
    
            // 獲取線程名稱並且在控制檯進行輸出
            System.out.println(t1.getName() + "線程的優先級=" + t1.getPriority());
            System.out.println(t2.getName() + "線程的優先級=" + t2.getPriority());
    
            // 啓動線程
            t1.start();
            t2.start();
    
        }
    
    }

控制檯的輸出結果

pbteach-01線程的優先級=5
pbteach-02線程的優先級=5
pbteach-01=0
pbteach-02=0
pbteach-01=1
pbteach-02=1
...

由於"pbteach-01"線程和"pbteach-02"線程的優先級都是5,因此係統會隨機選擇一個線程去執行。

設置線程優先級代碼實現

測試類

  public class ThreadDemo02 {
    
        public static void main(String[] args) {
    
            // 創建MyThread對象以及設置線程名稱
            MyThread t1 = new MyThread() ;
            t1.setName("pbteach-01");
    
            // 創建MyThread對象以及設置線程名稱
            MyThread t2 = new MyThread() ;
            t2.setName("pbteach-02");
    
            // 設置線程名稱
            t1.setPriority(8);
            t2.setPriority(4);
    
            // 啓動線程
            t1.start();
            t2.start();
    
        }
    
    }

控制檯輸出結果

pbteach-01= 0
pbteach-01 =1
pbteach-01= 2
pbteach-01= 3
pbteach-02= 0
pbteach-01= 4
pbteach-02= 1
...

按照我們的理解,"pbteach-01"線程的優先級要高於"pbteach-02"線程的優先級,那麼程序的執行結果應該是先把"pbteach-01"線程的代碼執行完畢,執行完畢以後再執行
"pbteach-02"線程代碼。但是控制檯的輸出結果和我們的想法有點不太相同。原因是因爲我們通過設置線程的優先級來"建議"jvm優先執行某一個線程,但是jvm不一定採納。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章