Java setPriority():设置线程优先级(附带实例)
计算机通常只有一个 CPU,在任意时刻只能执行一条机器指令,每个线程只有获得 CPU 的使用权才能执行指令。所谓多线程的并发运行,其实是指各个线程轮流获得 CPU 的使用权,分别执行各自的任务。
运行池中会有多个处于就绪状态的线程在等待 CPU。Java 虚拟机的一项任务就是负责线程的调度,线程调度是指按照特定机制为多个线程分配 CPU 的使用权。
Java 虚拟机采用抢占式调度模型,是指让优先级高的线程优先占用 CPU,如果可运行的线程优先级相同,那么就随机选择一个线程,使其占用 CPU,当该线程失去 CPU 之后,再随机选择其他线程获取 CPU 的使用权。
通常情况下,程序员不用关心线程的调度问题,但在某些特定的需求下需要改变这种模式,由程序自己来协调多个线程对 CPU 的使用。
在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。每一个线程都对应一个优先级,优先级越高的线程获得 CPU 执行的机会越大,而优先级越低的线程获得 CPU 执行的机会越小。
线程的优先级用 1~10 的整数表示,数值越大优先级越高,线程默认的优先级为 5。除了可以直接使用数字表示线程的优先级之外,还可以使用 Thread 类中提供的三个静态常量,分别表示最高优先级、最低优先级和默认优先级:
下面通过一个示例演示不同优先级的两个线程在程序中的运行情况。
运行池中会有多个处于就绪状态的线程在等待 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 次