1. 程式人生 > >java線程執行的優先級

java線程執行的優先級

效果 運行 lar public 函數 輪轉 main 不同 java

1.1 線程的優先級

java 中的線程優先級的範圍是1~10,默認的優先級是5。10極最高。

有時間片輪循機制。“高優先級線程”被分配CPU的概率高於“低優先級線程”。根據時間片輪循調度,所以能夠並發執行。無論是是級別相同還是不同,線程調用都不會絕對按照優先級執行,每次執行結果都不一樣,調度算法無規律可循,所以線程之間不能有先後依賴關系。

無時間片輪循機制時,高級別的線程優先執行,如果低級別的線程正在運行時,有高級別線程可運行狀態,則會執行完低級別線程,再去執行高級別線程。如果低級別線程處於等待、睡眠、阻塞狀態,或者調用yield()函數讓當前運行線程回到可運行狀態,以允許具有相同優先級或者高級別的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調度程序再次選中。結論:yield()從未導致線程轉到等待/睡眠/阻塞狀態。在大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但有可能沒有效果。

優先級測試程序:

package com.first;

public class ThreadPriority
{
public static void main(String[] args) {

System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")");

Thread t1=new ThreadP("thread1"); // 新建t1
Thread t2=new ThreadP("thread2"); // 新建t2
t1.setPriority(5); // 設置t1的優先級為1
t2.setPriority(5); // 設置t2的優先級為10
t1.start(); // 啟動t1
t2.start(); // 啟動t2
}

}
class ThreadP extends Thread{

public ThreadP(String name) {
super(name);
}

public void run(){
for (int i=0; i<5; i++) {
System.out

.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")"
+", loop "+i);
}
}

}

運行結果如下:

main(5)

thread2(10), loop 0

thread1(1), loop 0

thread2(10), loop 1

thread2(10), loop 2

thread2(10), loop 3

thread2(10), loop 4

thread1(1), loop 1

thread1(1), loop 2

thread1(1), loop 3

thread1(1), loop 4

java線程執行的優先級