线程的优先级
在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。优先级越高的线程获得CPU执行的机会越大,而优先级越低的线程获得CPU执行的机会越小。线程的优先级用1~10之间的整数来表示,数字越大优先级越高。除了可以直接使用数字表示线程的优先级,还可以使用Thread类中提供的三个静态常量表示线程的优先级,如表1所示。
表1 Thread类的优先级常量
Thread**类的静态常量** | 功能描述 |
---|---|
static int MAX_PRIORITY | 表示线程的最高优先级,相当于值10 |
static int MIN_PRIORITY | 表示线程的最低优先级,相当于值1 |
static int NORM_PRIORIY | 表示线程的普通优先级,相当于值5 |
程序在运行期间,处于就绪状态的每个线程都有自己的优先级,例如main线程具有普通优先级。然而线程优先级不是固定不变的,可以通过Thread类的setPriority(int newPriority)方法对其进行设置,该方法中的参数newPriority接收的是1~10之间的整数或者Thread类的三个静态常量。接下来通过一个案例来演示不同优先级的两个线程在程序中的运行情况,如文件1所示。
文件1 Example07.java
1 public class Example07 {
2 public static void main(String[] args) {
3 // 分别创建两个Thread线程对象
4 Thread thread1 = new Thread(() -> {
5 for (int i = 0; i < 10; i++) {
6 System.out.println(Thread.currentThread().getName()
7 + "正在输出i:" + i);
8 }
9 },"优先级较低的线程");
10
11 Thread thread2 = new Thread(() -> {
12 for (int j = 0; j < 10; j++) {
13 System.out.println(Thread.currentThread().getName()
14 + "正在输出j:" + j);
15 }
16 },"优先级较高的线程");
17 // 分别设置线程的优先级
18 thread1.setPriority(Thread.MIN_PRIORITY);
19 thread2.setPriority(10);
20 // 开启两个线程
21 thread1.start();
22 thread2.start();
23 }
24 }
运行结果如图1所示。
图1 运行结果
文件1中,创建了两个线程thread1和thread2,分别将线程的优先级设置为1和10,从图1可以看出,优先级较高的thread2线程会获得更多的机会优先执行。
需要注意的是,虽然Java中提供了10个线程优先级,但是这些优先级需要操作系统的支持,不同的操作系统对优先级的支持是不一样的,不能很好的和Java中线程优先级一一对应,因此,在设计多线程应用程序时,其功能的实现一定不能依赖于线程的优先级,而只能把线程优先级作为一种提高程序效率的手段。