设置线程优先级需在start()前调用setPriority(),取值1–10(对应MIN/NORM/MAX_PRIORITY),超范围抛IllegalArgumentException;子线程默认继承父线程优先级;优先级仅为调度提示,不可用于业务逻辑同步。

继承 Thread 类设置线程优先级,核心是调用 setPriority() 方法,并确保在 start() 之前完成设置。优先级本身不保证执行顺序,仅作为调度提示,实际效果受操作系统影响。
优先级取值范围与常量
Java 线程优先级为整数 1–10:
-
1:最低优先级,对应
Thread.MIN_PRIORITY -
5:默认优先级,对应
Thread.NORM_PRIORITY(主线程及新线程默认值) -
10:最高优先级,对应
Thread.MAX_PRIORITY
超出该范围会抛出 IllegalArgumentException,例如 setPriority(0) 或 setPriority(11) 均非法。
必须在 start() 之前设置
一旦线程已启动(start() 被调用),再调用 setPriority() 可能被忽略或无效——JVM 不保证此时修改生效。正确做法是在构造后、启动前设置:
立即学习“Java免费学习笔记(深入)”;
- 在子类构造方法中设置(推荐)
- 或在创建实例后、调用
start()前显式调用
示例:
class MyThread extends Thread {<br> public MyThread(int priority) {<br> this.setPriority(priority); // ✅ 构造中设置<br> }<br> public void run() {<br> System.out.println("Priority: " + this.getPriority());<br> }<br>}<br><br>MyThread t = new MyThread(Thread.MAX_PRIORITY);<br>t.start(); // ✅ 此时优先级已生效
子线程自动继承父线程优先级
若未显式设置,继承 Thread 的子线程会沿用创建它的线程的优先级。例如:
- 主线程默认为 5,它 new 出的
MyThread实例初始优先级也是 5 - 若主线程已调高至 8,后续创建的子线程默认就是 8,除非再次调用
setPriority()
因此,若需统一控制,建议显式设置,避免隐式继承导致行为不可预期。
不要依赖优先级实现业务逻辑
线程优先级不是同步机制,不能用于保障执行先后、数据可见性或互斥访问:
- 高优先级线程仍可能被低优先级线程抢占(尤其在时间片轮转系统中)
- Linux 默认忽略 Java 优先级映射;Windows 映射为 7 级,存在压缩损失
- 过度依赖可能导致低优先级线程“饥饿”,反而降低整体吞吐
真正需要确定顺序或协作时,应使用 synchronized、Lock、CountDownLatch 或 CompletableFuture 等机制。


















