在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。优先级越高的线程获得 CPU 执行的机会越大,而优先级越低的线程获得 CPU 执行的机会越小。线程的优先级用 1~10 的整数来表示,数字越大优先级越高。除了可以直接使用数字表示线程的优先级,还可以使用 Thread 类中提供的 3 给静态常量表示线程的优先级,如下表所示。

    Thread 类的静态常量 功能描述
    static int MAX_PRIORITY 表示线程的最高优先级,值为 10
    static int MIN_PRIORITY 表示线程的最低优先级,值为 1
    static int NORM_PRIORITY 表示线程的普通优先级,值为 5

    程序在运行期间,处于就绪状态的每个线程都有自己的优先级,例如 main 线程具有普通优先级。然而线程优先级不是固定不变的,可以通过 Thread 类的 setPriority(int newPriority)方法对其进行设置,该方法中的参数 newPriority 接收的是 1~10 之间的整数或者 Thread 类的三个静态常量。接下来通过一个案例来演示不同优先级的两个线程在程序中的运行情况,如下所示。

    1. public class example06 {
    2. public static void main(String[] args) {
    3. Thread minPriority = new Thread(new Task(), "优先级较低的线程");
    4. Thread maxPriority = new Thread(new Task(), "优先级较高的线程");
    5. minPriority.setPriority(Thread.MIN_PRIORITY); //设置线程优先级为 1
    6. maxPriority.setPriority(Thread.MAX_PRIORITY); //设置线程优先级为 10
    7. //开启两个线程
    8. minPriority.start();
    9. maxPriority.start();
    10. }
    11. }
    12. //定义一个线程类的任务类
    13. class Task implements Runnable {
    14. @Override
    15. public void run() {
    16. for (int i = 0; i < 10; i++) {
    17. System.out.println(Thread.currentThread().getName() + "正在输出" + i);
    18. }
    19. }
    20. }

    运行结果如下所示。
    QQ截图20200709125814.png
    在上述代码块汇中,创建了两个线程 minPriority 和 maxPriority,分别将线程的优先级设置为 1 和 10。由于优先级越高的线程获取 CPU 切换时间的几率越大,所以其优先执行的机会也较大。从运行结果可以看出,优先级较高的 maxPriority 线程先运行了,运行完毕后,优先级较低的 minPriority 线程才开始运行。

    需要注意的是,虽然 Java 中提供了 10 个线程优先级,但是这些优先级需要操作系统的支持。不同的操作系统对优先级的支持是不一样的,不会与 Java 中线程优先级一一对应。因此,在设计多线程应用程序时,其功能的实现**一定不能依赖于线程的优先级,而只能把线程优先级作为一种提高程序效率**的手段