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

news2024/12/24 2:32:27

什么是线程优先级?

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

在 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 thread
		Thread.currentThread().setPriority(7);

		// Printing main thread priority
		System.out.println("Main thread priority: " + Thread.currentThread().getPriority());

		// Creating child thread
		ThreadDemo childThread = new ThreadDemo();

		// Printing child thread priority
		System.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 {
        @Override
        public 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 年高教社杯全国大学生数学建模竞赛C题—农作物的种植策略(讲解+代码+成品论文助攻)

2024数学建模国赛选题建议团队助攻资料-CSDN博客文章浏览阅读1k次,点赞20次,收藏24次。通过分析5个题目的特点,可知数学建模常用的模型大概可以分为五大类——https://blog.csdn.net/qq_41489047/article/details/141925859 本次国赛white学长…

WebAPI(四) BOM;延时函数;JS执行机制(同步异步);location对象;history对象;navigation对象

文章目录 BOM1. 定时器-延时函数2. JS执行机制(1)、同步与异步(2)、事件循环 3. location对象(1)、href属性获取完整的url地址(2)search属性获取地址中携带的参数(3) hash:获取地址中的#后边的部分(3) reload: 刷新当前页面,传入参数true表示…

025集—— 转义字符\、字符串详解(对比、分割、日期、数字等)——C#学习笔记

本文讲解字符串的比较:忽略大小写与不忽略大小写,内存地址是否相同。 当需要对两个字符串的值进行比较和排序而不需要考虑语言惯例时,请使用基本的序号比较。基本的序号比较 (Ordinal) 是区分大小写的,这意味着两个字符串的字符必…

纳米材料咋设计?蛋白质模块咋用?看这里就知道啦!

大家好,今天我们来了解一项关于蛋白质纳米材料设计的研究——《Blueprinting extendable nanomaterials with standardized protein blocks》发表于《Nature》。蛋白质结构复杂,其组装体的设计颇具挑战。但近期的研究取得了新突破,通过设计标…

高精度治具加工的重要性和创新性

在现代制造业中,高精度治具加工扮演着至关重要的角色。它不仅是生产过程中的关键环节,更是推动行业不断创新和发展的重要力量。时利和将解析高精度治具加工的重要性和创新性。 一、高精度治具加工的重要性 1.确保产品质量 高精度治具能够为生产过程提供准…

API安全 | 发现API的5个小tips

在安全测试目标时,最有趣的测试部分是它的 API。API 是动态的,它们比应用程序的其他部分更新得更频繁,并且负责许多后端繁重的工作。在现代应用程序中,我们通常会看到 REST API,但也会看到其他形式,例如 Gr…

基于yolov8的包装盒纸板破损缺陷测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的包装盒纸板破损缺陷检测系统是一种高效、智能的解决方案,旨在提高生产线上包装盒纸板的质量检测效率与准确性。该系统利用YOLOv8这一前沿的深度学习模型,通过其强大的目标检测能力,能够实时识别并标记出包装盒纸板…

HyperLogLog简介

基数估算 基数估算(Cardinality Estimation),也称为 count-distinct problem,一直是大数据领域的重要问题之一,顾名思义,基数估算就是为了估算在一批超级大的数据中,它的不重复元素有多少个。常见的基数估算算法包括L…

HTML 基础,尚优选网站设计开发(二)

最近在恶补HTML相关知识点,本人是后端程序员,看到周围很多人都被裁员了,突然想尽早转变成全栈程序员变成独立开发者,有空余接接私单、商单的 尚优选网站设计开发,HTMLCSSJavaScript实际使用 尚优选网站设计开发页面分析…

《Web性能权威指南》-HTTP-读书笔记

HTTP简史 HTTP(HyperText Transfer Protocol,超文本传输协议)。 HTTP 0.9:只有一行的协议 Tim Berners-Lee罗列HTTP协议的几条宏观设计目标:支持文件传输、能够请求对超文本文档的索引搜索、格式化协商机制&#xf…

全季恒温,网球爱好者的理想运动场馆—轻空间

气膜网球馆内配备了先进的恒温恒压系统,不论四季如何变化,都能为运动员们提供一个稳定、舒适的运动环境。凉爽的空气流通,配合无障碍的视觉体验,打造了一个极致的训练与比赛场所。 大人挥拍竞技,孩子们快乐训练 馆内不…

第四届摩纳哥智能化可持续发展码头交流会

第四届摩纳哥智能化可持续发展码头交流会 摩纳哥游艇码头顾问公司(M3)认为游艇行业的绿色转型需要做到从游艇本身到游艇码头的360度全方位可持续化发展,因此,继今年3月的摩纳哥智能游艇交流会后,他们将于2024年9月22日…

[第三篇 运维与安全管理] ==> 第8章 数据库安全管理与审计

MongoDB 数据库安全管理与审计 8.1 权限管理简介8.2 用户管理8.2.1 创建用户与登录8.2.2 查询用户8.2.3 修改用户8.2.4 删除用户8.2.5 授予用户权限8.2.6 撤销用户权限 8.3 角色管理8.3.1 内建角色8.3.2 创建自定义角色8.3.3 查询自定义角色8.3.4 修改自定义角色8.3.5 删除自定…

day44-测试平台搭建之前端vue学习-基础3

目录 一、条件渲染 二、列表渲染 三、收集表单数据 四、内置指令 五、自定义指令 六、今日学习思维导图 一、条件渲染 1.1.v-if 1).写法 1.1).v-if"表达式" 1.2).v-else-if"表达式" 1.3).v-else"表达式‘ 2).适用于:切换频率较低的场…

Kafka 实战演练:创建、配置与测试 Kafka全面教程

文章目录 1.配置文件2.消费者1.注解方式2.KafkaConsumer 3.依赖1.注解依赖2.KafkaConsumer依赖 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都…

腾讯地图SDK Android版开发 10 InfoWindow

腾讯地图SDK Android版开发 10 InfoWindow 前言介绍默认风格自定义样式实现方式交互操作播放信息窗口的动画开启多窗口模式 相关类和接口默认样式MarkerOptions 类Marker 类TencentMap类TencentMap.OnInfoWindowClickListener 接口类 自定义样式TencentMap 类TencentMap.InfoWi…

6.2高斯滤波

目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验代码3 运行结果3 实验原理 在OpenCV中,高斯滤波(Gaussian Filtering)是一种非常常用的图像平滑处理方法。它通过使用一个高斯核(即高斯分布函数)对…

Pr 入门系列之二:导入与管理素材(下)

◆ ◆ ◆ 管理素材 导入素材后,项目面板中每一个媒体都只是原始素材的“链接”。 所以,视频编辑过程中一般情况下都不会破坏原始素材。 1、在不同视图模式下组织素材 项目面板提供了三大视图 View供选用:列表视图、图标视图以及自由格式视图…

基于VAE和流模型的AIGC技术

哇哦,VAE(变分自编码器)和流模型在AI生成内容(AIGC)领域可真是大放异彩呢!🚀🌟 它们就像魔法师一样,能够创造出各种各样、高质量的数据,从图像到音频&#xf…

计算机网络(三) —— 简单Udp网络程序

目录 一,初始化服务器 1.0 辅助文件 1.1 socket函数 1.2 填充sockaddr结构体 1.3 bind绑定函数 1.4 字符串IP和整数IP的转换 二,运行服务器 2.1 接收 2.2 处理 2.3 返回 三,客户端实现 3.1 UdpClient.cc 实现 3.2 Main.cc 实现 …