java 22 - 6 多線程之線程調度和設置線程的優先級


線程調度 

假如我們的計算機只有一個 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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM