java設定執行緒優先順序的誤區
阿新 • • 發佈:2018-12-12
對執行緒有一些瞭解的讀者知道,線上程中,我們可以通過執行緒的setPriority()方法來設定執行緒的優先順序,方法的引數是一個整型值,可以填寫從1~10的值。當我們建立執行緒的時候,java預設給執行緒設定的優先順序是5,1為最低優先順序,10為最高優先順序。下面的例子建立了a,b兩個執行緒並給它們設定了優先順序:
public static void main(String[] args) {
Thread a=new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i< 10;i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("a");
}
System.out.println("a執行緒執行完畢");
}
});
Thread b=new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("b");
}
System.out.println("b執行緒執行完畢");
}
});
a.setPriority(1);
b. setPriority(10);
a.start();
b.start();
}
誤區
那麼,我們很容易就以為,執行緒的優先順序是執行緒從cpu手裡搶到資源的權重,認為優先順序越高的執行緒越容易線上程競爭中獲勝,這是初學者的一個誤區。
例如,剛剛上面的程式碼給a執行緒設定了最低優先順序,給b執行緒設定了最高優先順序,按照錯誤的想法,a執行緒更容易搶到資源,那麼在同一時間內打印出的a字母應該比b多,可事實結果是什麼呢?
多實驗幾次,我們會發現,優先順序和執行緒搶到資源的概率並沒有關係,而是在有多個執行緒的時候,用來設定一上來從哪個執行緒開始執行的優先順序的,和之後搶奪cpu的權重並無關係。