一、线程优先级概述

        Java中的线程可以有自己的优先级。优先级高的线程在竞争资源时会更有优势,更有可能抢占到资源而优先被执行。当然这也只是一个概率问题,并不是一定就是这样。如果运气不好,那高优先级的线程可能也会抢占资源失败。

线程的优先级调度和底层操作系统有密切关系,在各个平台上表现不一,并且这种优先级产生的后果也可能容易预测,无法精准控制。比如一个低优先级的线程可能一直抢占不到资源,从而始终无法运行,而产生饥饿(虽然优先级低,但是也不能饿死它)。因此在要求严格的场全,还是需要自己在应用层解决程序调度问题。

       在Java中,使用1到10表示优先级。一般可以使用Thread类内置的三个静态标量表示,下面的是从Thread类中截图的。

android 优先级 线程池 java线程优先级的意义_优先级

        数字越大则优先级越高,但有效范围是1到10。线程优先级高的线程倾向于更快的完成任务。下面通过实例来说明线程的优先级。

package com.ethan.concurrent;

/**
 * @ClassName PriorityDemo.java
 * @Description 线程优先级示例
 * @Author Ethan
 * @Version 1.0
 */

public class PriorityDemo {

    public static void main (String[] args) {
        Thread highThread = new HighPriority();
        LowPriority lowThread = new LowPriority();

        highThread.setPriority(Thread.MAX_PRIORITY);
        lowThread.setPriority(Thread.MIN_PRIORITY);

        lowThread.start();
        highThread.start();
    }


    /**
     * @Description 优先级高的线程类
     * @Author Ethan
     * @Param
     * @return
     * @change: time:   author:  description:
     */
    public static class HighPriority extends Thread {

        static int count = 0;

        @Override
        public void run () {
            while (true) {
                synchronized (PriorityDemo.class) {
                    count ++;
                    if (count > 10000000) {
                        System.out.println("------------HighPriority is complete!---------------");
                        break;
                    }
                }
            }
        }
    }


    /**
     * @Description 优先级低的线程类
     * @Author Ethan
     * @Param
     * @return
     * @change: time:   author:  description:
     */
    public static class LowPriority extends Thread {
        static int count = 0;

        @Override
        public void run () {
            while (true) {
                synchronized (PriorityDemo.class) {
                    count ++;
                    if (count > 10000000) {
                        System.out.println("------------LowPriority is complete!---------------");
                        break;
                    }
                }
            }
        }
    }

}

        打印结果如下所示,从结果可以看出,线程优先级高的先执行完成。但需要注意的是,在有很多线程的情况下,优先级高的线程会先执行完,但不一定是优先级高的线程都是全部先执行完。

android 优先级 线程池 java线程优先级的意义_优先级_02

 

二、特性

        2,1 继承性

        若线程A启动了线程B,那么B线程的优先级与A线程是一样的。

 

        2,2 规则性

        使用setPriority()方法设置线程的优先级后,线程会按照优先级的大小先后执行,但不一定就是优先级高的线程先执行完。如果打印出线程的优先级,打印的顺序并不一定是代码的顺序,因为前面的代码优先级可能没有后面线程的优先级高,因此前面的线程可能会后面执行。

 

        2,3 随机性

        优先级高的线程不一定是每一次都先执行完。

 

 

三、总结

线程的优先级调度和底层操作系统有密切关系,在各个平台上表现不一,并且这种优先级产生的后果也可能容易预测,无法精准控制。比如一个低优先级的线程可能一直抢占不到资源,从而始终无法运行,而产生饥饿(虽然优先级低,但是也不能饿死它)。因此在要求严格的场全,还是需要自己在应用层解决程序调度问题。

 

注:以上内容参考《实战Java高并发程序设计(第2版)》与《Java多线程编程核心技术》。