1. 程式人生 > >Java多執行緒優先順序

Java多執行緒優先順序

執行緒的優先順序將該執行緒的重要性傳遞給排程器。儘管CPU處理現有執行緒集的順序是不確定的,但是排程器將傾向於讓優先權最高的執行緒先執行。

你可以用getPriority()來讀取現有執行緒的優先順序,並且在任何時刻都可以通過setPriority()來修改優先順序。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SimplePriorities implements Runnable {

    private int countDown = 5;

    /*Java語言規範第三版中對volatile的定義如下: java程式語言允許執行緒訪問共享變數,
    為了確保共享變數能被準確和一致的更新,執行緒應該確保通過排他鎖單獨獲得這個變數。
    Java語言提供了volatile,在某些情況下比鎖更加方便。如果一個欄位被宣告成volatile,
    java執行緒記憶體模型確保所有執行緒看到這個變數的值是一致的。*/
    private volatile double d;
    private int priority;

    public SimplePriorities(int priority){
        this.priority = priority;
    }

    public String toString(){
        //獲取當前執行緒資訊
        return Thread.currentThread() + ":" + countDown;
    }

    @Override
    public void run() {
        //設定執行緒優先順序 1-10
        Thread.currentThread().setPriority(priority);

        while(true){

            for(int i = 0;i<100000;i++){
                d += (Math.PI + Math.E) / (double)i;
                if(i%1000 == 0){
                    Thread.yield();
                }
            }
            System.out.println(this.toString());

            if(--countDown == 0)return;

        }

    }

    public static void main(String[] args) {


        ExecutorService exec = Executors.newCachedThreadPool();

        //優先順序為1
        exec.execute(new SimplePriorities(Thread.MIN_PRIORITY));
        //優先順序為10
        exec.execute(new SimplePriorities(Thread.MAX_PRIORITY));

        exec.shutdown();
    }

}

toString()方法被覆蓋,以便使用Thread.toString()方法來列印執行緒的名稱,執行緒的優先順序以及執行緒所屬的“執行緒組”。

這裡寫圖片描述
這裡寫圖片描述
通過這兩張截圖可以看出,雖然設定了執行緒優先順序,但是不一定有效,取決權還是在於排程器。
在絕大多數時間裡,所有執行緒都應該以預設的優先順序執行。試圖操縱執行緒優先順序通常是一種錯誤