線程調度
假如我們的計算機只有一個 CPU,那么 CPU 在某一個時刻只能執行一條指令,線程只有得到 CPU時間片,也就是使用權,才可以執行指令。
那么Java是如何對線程進行調用的呢?
線程有兩種調度模型:
分時調度模型 所有線程輪流使用 CPU 的使用權,平均分配每個線程占用 CPU 的時間片
搶占式調度模型 優先讓優先級高的線程使用 CPU,如果線程的優先級相同,那么會隨機選擇一個,優先級高的線程獲取的 CPU 時間片相對多一些。
Java使用的是搶占式調度模型。
既然線程設有設置優先級,那么肯定有默認優先級。
那么,默認優先級是多少呢? 如何獲取線程對象的優先級?
public final int getPriority():返回線程對象的優先級
如何設置線程對象的優先級呢?
public final void setPriority(int newPriority):更改線程的優先級。
注意:
線程默認優先級是5。
線程優先級的范圍是:1-10。
線程優先級高僅僅表示線程獲取的 CPU時間片的幾率高,但是要在次數比較多,或者多次運行的時候才能看到比較好的效果。
IllegalArgumentException:非法參數異常。
拋出的異常表明向方法傳遞了一個不合法或不正確的參數。就是設置的優先級超出了線程優先級的范圍。
獲取線程的優先級,查看系統默認的線程優先級,以及設置線程優先級:
1 public static void main(String[] args) { 2 3 // 創建兩個線程對象 4 MyThread mt1 = new MyThread(); 5 MyThread mt2 = new MyThread(); 6 MyThread mt3 = new MyThread(); 7 8 //調用方法設置線程名稱 9 mt1.setName("哈士奇"); 10 mt2.setName("薩摩耶"); 11 mt3.setName("短尾貓"); 12 13 //獲取默認優先級 結果都是5,證明系統默認的線程優先級是5 14 System.out.println(mt1.getPriority()); 15 System.out.println(mt2.getPriority()); 16 System.out.println(mt3.getPriority()); 17 18 //設置線程優先級 19 //數字越大的優先級越高。但是,優先級高只是意味着該線程獲取的 CPU 時間片相對多一些。並不是說是先讓你走完。 20 mt1.setPriority(1); 21 mt2.setPriority(6); 22 mt3.setPriority(10); 23 24 25 mt1.start(); 26 mt2.start(); 27 mt3.start(); 28 29 }
