zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    winform编程设定listview选中行
    更新客户信息
    在Flutter中使用Android、iOS的原生 View
    怎么卸载nodejs?
    JavaScript实现简单的图片瀑布流插件
    通过代码重用攻击绕过现代XSS防御
    炫酷的播放粒子效果,你也可以学会!使用Web动画API制作
    14行实现js原生语法前端模板引擎
    什么是ESLint?
    js中require和import的区别
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/14704577.html
Copyright © 2011-2022 走看看