当前位置: 首页 > news >正文

Java并发编程实战 06 | 为什么不建议使用线程优先级?

什么是线程优先级?

线程优先级是一个标识,用来提示操作系统或线程调度器哪个线程更重要、更需要优先执行。优先级通常是一个整数值。

在 Java 中,线程优先级的设置范围从 1 到 10,其中 1 是最低优先级,10 是最高优先级。Java 默认情况下,线程的优先级是 5。

优先级高的线程通常会获得更多的 CPU 时间片,从而优先执行。但这不是绝对的,操作系统的线程调度器可能会因为其他因素(如操作系统的负载、线程的状态等)来决定实际的执行顺序。

在 Java 中,我们可以通过 Thread 类的 setPriority() 方法来设置线程的优先级。例如:

public  class  Demo { public  static  void  main ( String[] args ) { Thread a = new Thread(); System. out .println( "默认线程优先级:" +a.getPriority()); Thread b = new Thread(); b.setPriority( 9 ); System. out .println( "设置线程优先级:" +b.getPriority()); } 
}//输出:
默认线程优先级:5
设置线程优先级:9

需要注意的是线程的优先级如果要设置必须在线程启动之前设置好。

父子关系中的线程优先级

如果子线程没有显示设置优先级。那么它会继承父线程的优先级。

class ThreadDemo extends Thread
{public void run(){System.out.println(Inside run method”);}public static void main(String[] args){// Setting priority for main threadThread.currentThread().setPriority(7);// Printing main thread prioritySystem.out.println("Main thread priority: " + Thread.currentThread().getPriority());// Creating child threadThreadDemo childThread = new ThreadDemo();// Printing child thread prioritySystem.out.println("Child thread priority: " + childThread.getPriority());	//7}
}//输出:
Main thread priority: 7
Child thread priority: 7

注意程序的输出。我们可以看到父线程 ( main ) 和子线程 ( childThread ) 具有相同的优先级。

为什么不推荐手动设置优先级

虽然 Java 提供了从 1 到 10 的线程优先级设置,你可能会认为通过调整线程优先级就能控制线程的执行顺序。然而,实际上并不是这样!

在 Java 中,线程优先级的设置并不总是可靠。线程优先级只是对操作系统的一个“建议”,操作系统不一定会严格按照这些优先级来调度线程的执行顺序。具体的执行顺序还是由操作系统的线程调度算法决定的,这意味着优先级高的线程不一定总是会先执行。

为了验证这一点,我们可以通过代码示例来观察线程优先级对执行顺序的实际影响。以下是一个简单的 Java 代码示例,用于演示线程优先级的效果:

public class TestExecuteOrder {static class MyRunnable implements Runnable {@Overridepublic void run() {System.out.printf("The currently executing thread is:%s,priority:%d%n",Thread.currentThread().getName(),Thread.currentThread().getPriority());}}public static void main(String[] args) {Thread t1 = new Thread(new MyRunnable());t1.setPriority(1);Thread t2 = new Thread(new MyRunnable());t2.setPriority(5);Thread t3 = new Thread(new MyRunnable());t3.setPriority(10);t3.start();t2.start();t1.start();}
}//输出:
The currently executing thread is:Thread-1,priority:5-1,priority:5
The currently executing thread is:Thread-2,priority:10
The currently executing thread is:Thread-0,priority:1

如果线程优先级设置能够完全控制线程的执行顺序,那么我们应该看到优先级为 10 的线程先于优先级为 5 的线程输出结果,而优先级为 1 的线程结果最后输出。

然而,在实际运行中,你可能会发现优先级为 5 的线程却先于优先级为 10 的线程输出结果。这表明线程优先级的设置并没有严格地控制线程的执行顺序,这也反映了线程优先级设置的实际可靠性问题。

在上一篇文章中,我们讨论了线程必须存在于线程组中。那么,当线程的优先级与其线程组的优先级不同时会发生什么?我们用以下代码来验证一下:

public class ThreadGroupOrder {public static void main(String[] args) {ThreadGroup myThreadGroup = new ThreadGroup("myThreadGroup");myThreadGroup.setMaxPriority(6);Thread myThread = new Thread(myThreadGroup, "myThread");myThread.setPriority(8);System.out.println("Thread group priority: " + myThreadGroup.getMaxPriority());System.out.println("Thread priority: " + myThread.getPriority());}
}//输出:
Thread group priority: 6
Thread priority: 6

可以看出如果线程的优先级高于其所在线程组的优先级,那么该线程的优先级将会被线程组的最高优先级替代。也就是说,线程的实际优先级将受到其线程组优先级的限制。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 企业级Ansible自动化运维项目案例:实战与技巧
  • Spring MVC: 构建Web应用的强大框架
  • 好用的 Markdown 编辑器组件
  • Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图
  • Laravel安全应用模块示例教程
  • 【视频讲解】Python贝叶斯卷积神经网络分类胸部X光图像数据集实例
  • 仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置
  • 从监控到智能:EasyCVR视频汇聚平台助力加油站安全监管升级转型
  • 黑神话:游戏的诞生
  • 桥接模式bridge
  • leetcode :746使用最小花费爬楼梯
  • 微软云技术深度解析与实战案例
  • 算法打卡——田忌赛马问题
  • (pycharm)安装python库函数Matplotlib步骤
  • 微服务架构设计模式简要介绍
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • angular学习第一篇-----环境搭建
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ECMAScript入门(七)--Module语法
  • MD5加密原理解析及OC版原理实现
  • Quartz初级教程
  • sublime配置文件
  • Vim 折腾记
  • vuex 笔记整理
  • 记一次用 NodeJs 实现模拟登录的思路
  • 移动端唤起键盘时取消position:fixed定位
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​MySQL主从复制一致性检测
  • # 计算机视觉入门
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • .Net Core 中间件验签
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET处理HTTP请求
  • .Net的C#语言取月份数值对应的MonthName值
  • .net对接阿里云CSB服务
  • .net开发时的诡异问题,button的onclick事件无效
  • @拔赤:Web前端开发十日谈
  • [BUUCTF]-Reverse:reverse3解析
  • [C#]使用深度学习算法opencvsharp部署RecRecNet广角图像畸变矫正校正摄像广角镜头畸变图像
  • [C语言]——柔性数组
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'XXX' 无效
  • [ndss 2023]确保联邦敏感主题分类免受中毒攻击
  • [one_demo_6]逆置整数