Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)

Posted 范丰平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)相关的知识,希望对你有一定的参考价值。

当程序中存在多个任务同时执行时,若多个任务的优先等级不一样,则可通过设定任务对应的线程优先级,使得对应的任务线程具备高优先级执行。通过 Thread.setPriority(线程优先级) 可以实现。示例代码如下所示:

package com.fanfengping.demo;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Demo12RunnablePriority implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{} 运行中 {}", Thread.currentThread().getName(), i);
        }
    }

    public static void main(String[] args) {
        Thread threadPriorityA = new Thread(new Demo12RunnablePriority(), "线程 A");
        Thread threadPriorityB = new Thread(new Demo12RunnablePriority(), "线程 B");
        Thread threadPriorityC = new Thread(new Demo12RunnablePriority(), "线程 C");

        /**
         * 设定线程的优先级;数值越大,优先级越高,
         * 取值范围 1 - 10,超出范围会抛 IllegalArgumentException 异常
         * 默认优先级为 Thread.NORM_PRIORITY = 5
         * 子线程默认父线程的优先级,子线程优先级设定不可大于父线程优先级
         * 高优先级线程在执行时,相对其他线程拥有优先权,具体执行时由 CPU 调度确定执行
         */
        threadPriorityC.setPriority(Thread.MAX_PRIORITY);
        threadPriorityA.setPriority(Thread.MIN_PRIORITY);

        threadPriorityA.start();
        threadPriorityB.start();
        threadPriorityC.start();
    }
}

 

执行程序,输出内容如下所示:

14:14:50.252 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 0
14:14:50.252 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 0
14:14:50.252 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 0
14:14:50.758 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 1
14:14:50.758 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 1
14:14:50.758 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 1
14:14:51.259 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 2
14:14:51.259 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 2
14:14:51.259 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 2
14:14:51.760 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 3
14:14:51.760 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 3
14:14:51.760 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 3
14:14:52.260 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 4
14:14:52.260 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 4
14:14:52.260 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 4

 

由程序输出,可以看出,高优先级线程可能在实际运行中并未完全获得高优先级的执行权,低优先级的线程也可能被优先执行。因而,线程自身的优先级高低,只是有更大的概率获得优先执行,但并非完全的优先执行,线程运行的实际优先级(执行先后顺序)与 CPU 的调度有直接关系。

 

关于线程优先级,有如下信息仅供参考(若有错误,敬请指正,非常感谢)

  1. Thread.setPriority()用来设定线程的优先级
  2. 优先级可以用从1到10的范围指定。10表示最高优先级(Thread.MAX_PRIORITY),1表示最低优先级(Thread.MIN_PRIORITY),5是普通优先级(Thread.NORM_PRIORITY,默认)
  3. 优先级不能超出1-10的取值范围,否则抛出IllegalArgumentException
  4. 在线程 start 方法被调用之前,线程的优先级应该被设定
  5. 线程的优先级不能超过所属线程组的优先级,即可以通过控制线程组的优先级,来控制线程组下线程的最大优先级
  6. 线程的优先级未设定时,默认所属的线程组的优先级
  7. 未指定线程优先级时,所有线程都携带普通优先级
  8. 优先级最高的线程在执行时被给予优先,最终由 CPU 调度程序决定哪一个线程被执行
  9. 与线程池中等待运行机会的线程相比,当前正在运行的线程可能总是拥有更高的优先级
  10. 不要嘉定高优先级线程一定先于低优先级的线程运行
  11. 不要有业务逻辑依赖于线程优先级,结果会无法预期

 

以上是关于Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)的主要内容,如果未能解决你的问题,请参考以下文章

Java--多线程之join,yield,sleep;线程优先级;定时器;守护线程

多线程学习-基础线程的调度

java多线程编程核心技术学习-2

黑马程序员_java08_多线程

黑马程序员_java08_多线程

Java篇多线程详解