【Java】多线程-线程优先级

Posted by 西维蜀黍 on 2019-02-01, Last Modified on 2021-09-21

线程优先级的设置

优先级取值范围

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