首页 > 编程笔记 > Java笔记 阅读:18

Java设置线程的优先级(setPriority()和getPriority())

在 Java 程序中,线程的优先级被线程调度器用来判定每个线程何时可以运行。

从理论上来说,优先级高的线程可以比优先级低的线程获得更多的 CPU 时间。实际上,线程获得的 CPU 时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的操作系统如何更有效地利用 CPU 时间)。

一个优先级高的线程自然比优先级低的线程优先。举例来说,当优先级低的线程正在运行,而一个优先级高的线程被恢复时,它将抢占优先级低的线程所使用的 CPU 时间。从理论上来说,同等优先级的线程有同等的权利使用 CPU 时间。

每个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。

Java 线程的优先级是一个整数,其取值范围是 1(Thread.MIN_PRIORITY)~10(Thread.MAX_PRIORITY)。在默认情况下,为每个线程分配一个优先级 NORM_PRIORITY(5)。

设置线程的优先级应该使用 setPriority() 方法,该方法也是 Thread 类的成员。它的方法签名如下:
final void setPriority(int level)
level 指定了对所调用的线程的新的优先级的设置。level 的取值范围必须为 MIN_PRIORITY~MAX_PRIORITY,即 1~10。这些优先级在 Thread 类中都被定义为 final 型变量。

开发者可以通过调用 Thread 类的 getPriority() 方法来获得当前优先级的设置。它的方法签名如下:
final int getPriority()
具有较高优先级的线程对程序更重要,并且应该在较低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,并且非常依赖底层平台。

【实例】线程优先级的应用。
public class Example {
    public static void main(String[] args) {
        Thread min = new Thread() {
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("min");
                    // 创建线程竞争机会
                    Thread.yield();
                }
            }
        };

        Thread max = new Thread() {
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("max");
                    // 创建线程竞争机会
                    Thread.yield();
                }
            }
        };
        // 设置线程的优先级
        min.setPriority(Thread.MIN_PRIORITY);
        max.setPriority(Thread.MAX_PRIORITY);
        min.start();
        max.start();
    }
}
运行结果为:

min
max
max
max
max
max
min
min
min
min

由运行结果可知,max 线程获取了更多的执行机会,在 min 线程输出一次后,max 线程运行至结束,min 线程再运行。

但是在实际测试时读者会发现,结果并不总是如此“理想”。因此,除了一些特殊的应用场景,开发者不应使用线程优先级来控制线程的执行顺序。

相关文章