线程优先级的设置
优先级取值范围
Java 线程优先级使用 1 ~ 10 的整数表示:
- 最低优先级 1:Thread.MIN_PRIORITY
- 最高优先级 10:Thread.MAX_PRIORITY
- 普通优先级 5:Thread.NORM_PRIORITY
获取线程优先级
public static void main(String[] args) { System.out.println(Thread.currentThread().getPriority();
// 5
}
设置优先级
Java 使用 setPriority
方法设置线程优先级,方法签名
public final void setPriority(int newPriority)
示例:
public static void main(String[] args) {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// 1
System.out.println(Thread.currentThread().getPriority());
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
// 10
System.out.println(Thread.currentThread().getPriority());
Thread.currentThread().setPriority(8);
// 8
System.out.println(Thread.currentThread().getPriority());
}
默认线程优先级
Java 默认的线程优先级是父线程的优先级,而非普通优先级Thread.NORM_PRIORITY
。只是因为主线程默认优先级是普通优先级Thread.NORM_PRIORITY
,所以如果没有显式地设置线程优先级时,新创建的线程的优先级就是普通优先级Thread.NORM_PRIORITY
。
线程调度
高优先级的线程比低优先级的线程有更高的几率得到执行(得到CPU时间片)。之所以说有“有更高的几率”,是因为当存在一个高优先级的线程时,低优先级的线程在高优先级的线程执行完成前,仍然有可能获得CPU时间片(而不是当一个高优先级的线程存在之后,高优先级的线程立刻抢占低优先级的线程的CPU时间片,直到这个高优先级的线程执行完成后,低优先级的线程才能继续执行)。
比如:
class Main extends Thread {
public Main(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
public static void main(String[] args) {
Thread t1 = new Main("A");
Thread t2 = new Main("B");
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
}
}
执行结果
A : 0
A : 1
B : 0
B : 1
B : 2
B : 3
A : 2
B : 4
B : 5
B : 6
A : 3
A : 4
A : 5
A : 6
A : 7
A : 8
A : 9
B : 7
B : 8
B : 9
而这个程序的执行结果不是稳定复现的(即每次执行得到的打印结果都不相同)。
Reference
- Java 多线程:线程优先级 - https://blog.csdn.net/Silent_Paladin/article/details/54561496