• 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. 不要有业务逻辑依赖于线程优先级,结果会无法预期
    我本渺小,但山峰,我一次次绝顶!


    PS:若有错误,敬请告知,不胜感激!
    Copyright @范丰平 版权所有,如需转载请标明本文原始链接出处,严禁商业用途! 我的个人博客链接地址:http://www.cnblogs.com/fengpingfan
  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/14704577.html
Copyright © 2020-2023  润新知