線程調度
線程的調度指的是系統爲線程分配CPU使用權的過程。
線程調度模型包括:
- 分時調度:指讓所有的線程輪流獲得cpu的使用權,並且平均分配每個線程佔用的CPU的時間片這個也比較好理解。
- 搶佔式調度模型:是指優先讓優先級高的線程優先佔用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不一定採納。