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

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

Java 程序中,所有处于就绪状态的线程会根据它们的优先级存放在运行池中,优先级高的线程运行的机会比较多,优先级低的线程运行机会比较少。

Thread 类的 setPriority(int newPriority)方法用于设置线程的优先级,getPriority() 方法用于获取线程的优先级。

优先级可以用 Thread 类中的静态常量来表示,如下表所示:

表:Thread 类的静态常量
常量 常量描述
static int MAX_PRIORITY 取值为 10,表示最高优先级
static int NORM_PRIORITY 取值为 5,表示默认优先级
static int MIN_PRIORITY 取值为 1,表示最低优先级

表中列出了 Thread 类中与优先级有关的 3 个静态常量,在设置线程的优先级时可以使用这些静态常量。

接下来,通过案例来演示线程优先级的使用:
public class Demo {
    public static void main(String[] args) throws InterruptedException {
        // 创建MyThread实例
        System.out.println("吃饭时吃菜的顺序:");
        MyThread myThread1 = new MyThread("水煮肉片");
        MyThread myThread2 = new MyThread("酱焖茼蒿");
        MyThread myThread3 = new MyThread("树根炒树皮");
        myThread1.setPriority(Thread.MIN_PRIORITY); // 设置优先级
        myThread2.setPriority(Thread.MAX_PRIORITY);
        myThread3.setPriority(Thread.NORM_PRIORITY);
        myThread1.start(); // 开启线程
        myThread2.start();
        myThread3.start();
    }
}

class MyThread extends Thread {
    private final String Cuisine;

    public MyThread(String Cuisine) {
        this.Cuisine = Cuisine;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Cuisine + i);
        }
    }
}
程序的运行结果如下:

吃饭时吃菜的顺序:
酱焖茼蒿0
树根炒树皮0
酱焖茼蒿1
酱焖茼蒿2
酱焖茼蒿3
酱焖茼蒿4
树根炒树皮1
树根炒树皮2
树根炒树皮3
树根炒树皮4
水煮肉片0
水煮肉片1
水煮肉片2
水煮肉片3
水煮肉片4

程序中声明了 MyThread 类,继承 Thread 类并重写了 run() 方法,run() 方法内循环打印结果。Demo 类在 main() 方法中先创建了 3 个 MyThread 类的实例并指定线程的名称,再使用 setPriority(int newPriority) 方法设置线程的优先级,最后调用 start() 方法启动线程。

从执行结果来看,优先级高的会优先执行。但需要注意的是,优先级比较低的不一定永远最后执行,也有可能先执行,只不过机率稍微小一点。

注意,Thread 类的 setPriority(int newPriority) 方法可以设置 10 种优先级,但是优先级的级别需要操作系统的支持,不同的操作系统上支持的优先级也各不同,所以要尽量避免直接用数字指定线程优先级,应该使用 Thread 类的 3 个静态常量指定线程优先级别,这样可以保证程序有很好的可移植性。

相关文章