Java 線程優先級(1~10,默認 5)常被誤以為能決定執行順序。本文深入剖析優先級 API、調度器行為、代碼驗證與最佳實踐,幫你避開「優先級決定論」誤區。
Thread.MIN_PRIORITY = 1Thread.NORM_PRIORITY = 5(默認)Thread.MAX_PRIORITY = 10int getPriority() / void setPriority(int)線程優先級只能影響獲取 CPU 時間片的概率,不能保證執行順序。 JVM 將優先級映射到底層 OS 調度器,但最終由操作系統決定,且受時間片輪轉、搶佔式調度、同步鎖、I/O 阻塞等多因素綜合影響。
class DemoThread extends Thread {
DemoThread(String name) { super(name); }
public void run() {
for (int i = 0; i < 3; i++)
System.out.println(getName() + " priority=" + getPriority() + " i=" + i);
}
}
public class PriorityTest {
public static void main(String[] args) {
Thread t1 = new DemoThread("T1-低"); t1.setPriority(Thread.MIN_PRIORITY);
Thread t2 = new DemoThread("T2-高"); t2.setPriority(Thread.MAX_PRIORITY);
Thread t3 = new DemoThread("T3-高"); t3.setPriority(Thread.MAX_PRIORITY);
t1.start(); t2.start(); t3.start();
}
}
T2-高 priority=10 i=0 T1-低 priority=1 i=0 T3-高 priority=10 i=0 T2-高 priority=10 i=1 T3-高 priority=10 i=1 T1-低 priority=1 i=1 ...
可見低優先級線程照樣插隊執行,高優先級僅統計上獲得更多 CPU 時間。
CountDownLatch、CyclicBarrier、Semaphore、CompletableFuture 等顯式同步工具。Java 線程優先級是「建議」而非「命令」。並發編程的正道是顯式同步、無鎖數據結構、合理拆分任務,而非調整優先級碰運氣。