摘要:java线程的调度某个线程若想被执行必须要得到 CPU 的使用权。,java 线程 调度。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。
在前面的小节介绍过,程序中的多个线程是并发执行的,某个线程若想被执行必须要得
到 CPU 的使用权。Java 虚拟机会按照特定的机制到为程序中的每个线程有分配 CPU 的使用
权,这种机制被称作线程的调度。
在计算机中,线程调度有两种模型。分别是分时调度模型和抢占式调度模型。所谓分时
调度模型是指让所有的线程轮流获得 CPU 的使用权,并且平均分配每个线程占用的 CPU 的
时间片。抢占式调度模型是指可运行池中优先级高的线程优先占用的 CPU,而对于优先级相
同的线程,随机选择一个线程使其占用 CPU,当它失去了 CPU 的使用权后,再随机选择其他
线程获取 CPU 使用权。Java 虚拟机默认采取抢占式调度模型,大多数情况下程序员不需要
去关心它,但在某些特定的需求下需要改变这种模式,由程序自己来控制 CPU 的调度。本
节将围绕线程调度的相关知识进行详细地讲解
14.4.1 线程的优先级
在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级,优先级
越高的线程获得 CPU 执行的机会越大,而优先级越低的线程获得 CPU 执行的机会越小,线
程的优先级用 1~10 之间的整数来表示,数字越大优先级越高,除了可以直接使用数字表示
线程的优先级,还可以使用 Thread 类中提供的三个静态常量表示线程的优先级,如表 14-1
所示。
程序在运行期间,处于就绪状态的每个线程都有自己的优先级。例如 main()线程具有普
通优先级。然而线程优先级不是固定不变的,可以通过 Thread 类的 setPriority(int newPriority)
方法对其进行设置,该方法中的参数 newPriority 接收的是 1~10 之间的整数或者 Thread 类
的三个静态常量。接下来通过一个案例来演示不同优先级的两个线程在程序中的运行情况,
如例 14-7 所示。
例 14-7 Example07.java
// 定义类 MaxPriority 实现 Runnable 接口
class MaxPriority implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "正在输出:" + i);
}
}
}
// 定义类 MinPriority 实现 Runnable 接口
class MinPriority implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "正在输出:" + i);
}
}
}
public class Example07 {
public static void main(String[] args) {
// 创建两个线程
Thread minPriority = new Thread(new MinPriority(), "优先级较低的线程");
Thread maxPriority = new Thread(new MaxPriority(), "优先级较高的线程");
minPriority.setPriority(Thread.MIN_PRIORITY); // 设置线程的优先级为 1
maxPriority.setPriority(10); // 设置线程的优先级为 10
// 开启两个线程
maxPriority.start();
minPriority.start();
}
}
运行结果如图 14-11 所示
例 14 -7 中,创建了两个线程 minPriority 和 maxPrority,分别将线程的优先级设置为 1 和
10,从运行结果可以看出优先级较高的 maxPiority 线程会先运行,运行完毕后优先级较低
的 minPriority 线程才开始运行。
需要注意的是,虽然 Java 中提供了 10 个线程优先级,但是这些优先级需要操作系统的
支持,不同的操作系统对优先级的支持是不一样的,不能很好的和 Java 中线程优先级一一
对应,因此,在设计多线程应用程序时,其功能的实现一定不能依赖于线程优先级,而只能
把线程优先级作为一种提高程序效率的手段。