Java设置线程优先级(setPriority和getPriority)
Java 程序中,所有处于就绪状态的线程会根据它们的优先级存放在运行池中,优先级高的线程运行的机会比较多,优先级低的线程运行机会比较少。
Thread 类的 setPriority(int newPriority)方法用于设置线程的优先级,getPriority() 方法用于获取线程的优先级。
优先级可以用 Thread 类中的静态常量来表示,如下表所示:
表中列出了 Thread 类中与优先级有关的 3 个静态常量,在设置线程的优先级时可以使用这些静态常量。
接下来,通过案例来演示线程优先级的使用:
从执行结果来看,优先级高的会优先执行。但需要注意的是,优先级比较低的不一定永远最后执行,也有可能先执行,只不过机率稍微小一点。
注意,Thread 类的 setPriority(int newPriority) 方法可以设置 10 种优先级,但是优先级的级别需要操作系统的支持,不同的操作系统上支持的优先级也各不同,所以要尽量避免直接用数字指定线程优先级,应该使用 Thread 类的 3 个静态常量指定线程优先级别,这样可以保证程序有很好的可移植性。
Thread 类的 setPriority(int newPriority)方法用于设置线程的优先级,getPriority() 方法用于获取线程的优先级。
优先级可以用 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
从执行结果来看,优先级高的会优先执行。但需要注意的是,优先级比较低的不一定永远最后执行,也有可能先执行,只不过机率稍微小一点。
注意,Thread 类的 setPriority(int newPriority) 方法可以设置 10 种优先级,但是优先级的级别需要操作系统的支持,不同的操作系统上支持的优先级也各不同,所以要尽量避免直接用数字指定线程优先级,应该使用 Thread 类的 3 个静态常量指定线程优先级别,这样可以保证程序有很好的可移植性。