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

Java setPriority():设置线程优先级(附带实例)

计算机通常只有一个 CPU,在任意时刻只能执行一条机器指令,每个线程只有获得 CPU 的使用权才能执行指令。所谓多线程的并发运行,其实是指各个线程轮流获得 CPU 的使用权,分别执行各自的任务。

运行池中会有多个处于就绪状态的线程在等待 CPU。Java 虚拟机的一项任务就是负责线程的调度,线程调度是指按照特定机制为多个线程分配 CPU 的使用权。

Java 虚拟机采用抢占式调度模型,是指让优先级高的线程优先占用 CPU,如果可运行的线程优先级相同,那么就随机选择一个线程,使其占用 CPU,当该线程失去 CPU 之后,再随机选择其他线程获取 CPU 的使用权。

通常情况下,程序员不用关心线程的调度问题,但在某些特定的需求下需要改变这种模式,由程序自己来协调多个线程对 CPU 的使用。

在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。每一个线程都对应一个优先级,优先级越高的线程获得 CPU 执行的机会越大,而优先级越低的线程获得 CPU 执行的机会越小。

线程的优先级用 1~10 的整数表示,数值越大优先级越高,线程默认的优先级为 5。除了可以直接使用数字表示线程的优先级之外,还可以使用 Thread 类中提供的三个静态常量,分别表示最高优先级、最低优先级和默认优先级:
static int MAX_PRIORITY;//线程可以具有的最高优先级,值为10
static int MIN_PRIORITY;//线程可以具有的最低优先级,值为1
static int NORM_PRIORITY;//分配给线程的默认优先级,值为5
线程的优先级不是固定不变的,可以通过 Thread 类的 setPriority(int newPriority) 方法设置线程的优先级,参数 newPriority 接收的是 1~10 的整数,或者 Thread 类的 3 个静态常量。

下面通过一个示例演示不同优先级的两个线程在程序中的运行情况。
public class ThreadPriority extends Thread {
    public ThreadPriority(String name) {
        super(name);
        System.out.println("创建 " + name + "线程");
    }
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()
                    + " 正在执行第 " + i + " 次");
        }
    }

    public static void main(String[] args) {
        ThreadPriority ta = new ThreadPriority("高优先级线程");  // 创建线程
        ThreadPriority tb = new ThreadPriority("低优先级线程");  // 创建线程

        ta.setPriority(Thread.MAX_PRIORITY);  // 设置线程为最大优先级
        tb.setPriority(Thread.MIN_PRIORITY);  // 设置线程为最低优先级
        ta.start();  // 启动线程
        tb.start();  // 启动线程
    }
}
程序运行结果为:

创建 高优先级线程 线程
创建 低优先级线程 线程
高优先级线程 正在执行第 0 次
高优先级线程 正在执行第 1 次
低优先级线程 正在执行第 0 次
高优先级线程 正在执行第 2 次
低优先级线程 正在执行第 1 次
高优先级线程 正在执行第 3 次
低优先级线程 正在执行第 2 次
高优先级线程 正在执行第 4 次
低优先级线程 正在执行第 3 次
低优先级线程 正在执行第 4 次

优先级高的线程只是意味着该线程获取 CPU 的概率相对高一些,并不是说高优先级的线程一直运行,很多时候它们是交替运行。

相关文章