Java多執行緒優先順序
阿新 • • 發佈:2019-02-08
執行緒的優先順序將該執行緒的重要性傳遞給排程器。儘管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()方法來列印執行緒的名稱,執行緒的優先順序以及執行緒所屬的“執行緒組”。
通過這兩張截圖可以看出,雖然設定了執行緒優先順序,但是不一定有效,取決權還是在於排程器。
在絕大多數時間裡,所有執行緒都應該以預設的優先順序執行。試圖操縱執行緒優先順序通常是一種錯誤