首先CPU處理現有線程集的順序是不確定的,但是調度器將傾向於讓優先級最高的線程先執行。即線程的優先級仍然無法保障線程的執行次序,只不過,優先級高的線程獲取CPU資源的概率較大,優先級低的並非沒機會執行。
public class SimplePrioritiesDemo implements Runnable{
private int countdown=5;
private int priority;
private volatile double d;
public SimplePrioritiesDemo(int priority) {
this.priority=priority;
}
public String toString() {
return Thread.currentThread()+": "+countdown;
}
public void run() {
Thread.currentThread().setPriority(priority);
while(true) {
for(int i=1;i<100000;i++) {
d+=(Math.PI+Math.E)/(double)i;
if(i%1000==0) {
Thread.yield();
}
}
System.out.println(this);
if(--countdown==0) return;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService exec=Executors.newCachedThreadPool();
for(int i=0;i<5;i++) {
exec.execute(new SimplePrioritiesDemo(Thread.MIN_PRIORITY));
}
exec.execute(new SimplePrioritiesDemo(Thread.MAX_PRIORITY));
exec.shutdown();
}
}
通過調用Thread.currentThread()可以獲取對驅動當前任務的Thread對象的引用。
getPriority()方法可以獲取線程的優先級,setPriority()方法可以設置線程的優先級。運行以上程序發現,並沒有按我們希望的執行順序執行,從而印證了上面的話,即優先級隻影響了各線程獲得CPU的概率,而並沒有確保每個線程執行的先後順序。
volatile關鍵字介紹