答案:java線程在創建后任何時候(線程終止前)都可以重新設置優先級
在網上搜索“線程的優先級在什么時候設置,在任何時候都能設置嗎?”之類的問題,得到的答案基本都說:
線程開始(start)之前,仔細想想好像也合理,但是,實踐是檢驗真理的唯一標准,在沒有代碼結果證明的情況下的這類答案往往是不可靠的
下面來驗證一下:
先寫個測試類
public class Test {
public static void main(String[] args) {
Runnable r=new Runnable() {
int num=0;
@Override
public void run() {
// TODO Auto-generated method stub
//線程循環阻塞,沒那么快死亡,方便驗證結果
for(int i=0;i<100;i++) {
num++;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread t=new Thread(r);
//查看線程創建后默認的優先級值
System.out.println(t.getPriority()+"++++++++++");
System.out.println(t.getPriority()+"++++++++++");
//線程啟動前設置線程的優先級值為7
t.setPriority(7);
//線程啟動前查看重新設置后線程的優先級值
System.out.println(t.getPriority()+"++++++++++1111");
System.out.println(t.getPriority()+"++++++++++1111");
//啟動線程
t.start();
//線程啟動后再次查看線程的優先級值
System.out.println(t.getPriority()+"++++++++++2222");
System.out.println(t.getPriority()+"++++++++++2222");
//線程啟動后設置線程的優先級值為8
t.setPriority(8);
System.out.println(t.getPriority()+"----------");
System.out.println(t.getPriority()+"----------");
//當前main線程休息10s后重新設置t線程優先級並查看優先級值
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//此時線程已經終止
t.setPriority(6);
System.out.println(t.getState());
System.out.println(t.getPriority()+"**********");
System.out.println(t.getPriority()+"**********");
}
}
輸出結果為:
5++++++++++
5++++++++++
7++++++++++1111
7++++++++++1111
7++++++++++2222
7++++++++++2222
8----------
8----------
TERMINATED
8**********
8**********