深入浅出线程组和线程优先级

今天我们来简单的介绍一下线程组和线程的关系,以及线程优先级的相关内容。

线程组(ThreadGroup)

Java 用 ThreadGroup 来表示线程组,我们可以通过线程组对线程进行批量控制。
每个 Thread 必然存在于一个 ThreadGroup 中,Thread 不能独立于 ThreadGroup 存在。执行main()方法的线程名字是 main,如果在 new Thread 时没有显式指定,那么默认将父线程(当前执行 new Thread 的线程)线程组设置为自己的线程组。
示例代码:
Thread testThread = new Thread(() -> { System.out.println("testThread当前线程组名字:" + Thread.currentThread().getThreadGroup().getName()); System.out.println("testThread线程名字:" + Thread.currentThread().getName()); }); testThread.start(); System.out.println("执行main所在线程的线程组名字: " + Thread.currentThread().getThreadGroup().getName()); System.out.println("执行main方法线程名字:" + Thread.currentThread().getName());
以下是程序的运行结果:
ThreadGroup 是一个标准的向下引用的树状结构,这样设计可以防止"上级"线程被"下级"线程引用而无法有效地被 GC 回收

线程组的常用方法及数据结构

获取当前线程的线程组名字

Thread.currentThread().getThreadGroup().getName()

复制线程组

// 获取当前的线程组 ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); // 复制一个线程组到一个线程数组(获取Thread信息) Thread[] threads = new Thread[threadGroup.activeCount()]; threadGroup.enumerate(threads);

线程组统一异常处理

// 创建一个线程组,并重新定义异常 ThreadGroup group = new ThreadGroup("testGroup") { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName() + ": " + e.getMessage()); } }; // 测试异常 Thread thread = new Thread(group, () -> { // 抛出 unchecked 异常 throw new RuntimeException("测试异常"); }); // 启动线程 thread.start();

线程的优先级

线程优先级可以指定,范围是 1~10。但并不是所有的操作系统都支持 10 级优先级的划分(比如有些操作系统只支持 3 级划分:低、中、高),Java 只是给操作系统一个优先级的参考值,线程最终在操作系统中的优先级还是由操作系统决定。
Java 默认的线程优先级为 5,线程的执行顺序由调度程序来决定,线程的优先级会在线程被调用之前设定。
通常情况下,高优先级的线程将会比低优先级的线程有更高的概率得到执行。Thread类的setPriority()方法可以用来设定线程的优先级。
Thread t1 = new Thread(); System.out.println("线程默认优先级:" + t1.getPriority()); Thread t2 = new Thread(); t2.setPriority(10); System.out.println("线程设置优先级等级为10后,线程的优先级:" + t2.getPriority());
输出结果:
既然有 10 个级别来设定线程的优先级,那是不是可以在业务实现的时候,采用这种方法来指定线程执行的先后顺序呢?
对于这个问题,答案是:No!
Java 中的优先级不是特别的可靠,Java 程序中对线程所设置的优先级只是给操作系统一个建议,操作系统不一定会采纳。而真正的调用顺序,是由操作系统的线程调度算法来决定的
我们通过代码来验证一下:
public class MyThread extends Thread { @Override public void run() { // 输出当前线程的名字和优先级 System.out.println("MyThread当前线程:" + Thread.currentThread().getName() + ",优先级:" + Thread.currentThread().getPriority()); } public static void main(String[] args) { for (int i = 1; i < 10; i++) { MyThread thread = new MyThread(); thread.setName("线程" + i); thread.setPriority(i); thread.start(); } } }
运行该程序,有时候可以按照优先级执行,有时却不行:
Java 提供了一个线程调度器来监视和控制处于RUNNABLE 状态的线程。
  • 线程的调度策略采用抢占式的方式,优先级高的线程会比优先级低的线程有更大的几率优先执行。
  • 在优先级相同的情况下,会按照“先到先得”的原则执行。
  • 每个 Java 程序都有一个默认的主线程,就是通过 JVM 启动的第一个线程——main 线程。
还有一种特殊的线程,叫做守护线程(Daemon),守护线程默认的优先级比较低。
  • 如果某线程是守护线程,那如果所有的非守护线程都结束了,这个守护线程也会自动结束。
  • 当所有的非守护线程结束时,守护线程会自动关闭,这就免去了还要继续关闭子线程的麻烦。
  • 线程默认是非守护线程,可以通过 Thread 类的 setDaemon 方法来设置为守护线程。

线程组和线程优先级之间的关系

之前我们谈到一个线程必然存在于一个线程组中,那么当线程和线程组的优先级不一致的时候会怎样呢?我们来验证一下:
// 创建一个线程组 ThreadGroup threadGroup = new ThreadGroup("testGroup"); threadGroup.setMaxPriority(8); System.out.println("线程组的优先级:" + threadGroup.getMaxPriority()); // 创建一个线程属于上述线程组 Thread thread = new Thread(threadGroup,"testThread"); thread.setPriority(10); System.out.println("线程的优先级:" + thread.getPriority());
运行程序后的输出结果:
所以,如果某个线程的优先级大于线程所在线程组的最大优先级,那么该线程的优先级将会失效,取而代之的是线程组的最大优先级。

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

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

相关文章

Java主流连接池详解:特性、优缺点与适用场景

在Java应用开发中&#xff0c;数据库连接是稀缺资源。频繁创建和关闭连接会导致大量系统开销&#xff0c;降低应用性能。连接池技术通过预先创建一定数量的数据库连接并复用&#xff0c;有效解决了这一问题。本文将详细介绍Java生态中主流的数据库连接池&#xff0c;包括C3P0、…

基于企业数据构建可扩展AI:Nemotron RAG与SQL Server 2025整合架构解析

在某中心Ignite 2025大会上&#xff0c;某中心SQL Server 2025的发布标志着企业级AI就绪数据库愿景的实现&#xff0c;为开发者提供了内置向量搜索和用于调用外部AI模型的SQL原生API等强大新工具。某机构已与某中心合作&#xff0c;将SQL Server 2025与某机构Nemotron RAG开源模…

学霸同款2026继续教育一键生成论文工具TOP9测评

学霸同款2026继续教育一键生成论文工具TOP9测评 2026年继续教育论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 在当前继续教育领域&#xff0c;论文撰写已成为学员提升学历、获取证书的必经之路。然而&#xff0c;面对繁重的工作与学习压力&#xff0c;许多学…

Java版LeetCode热题100之搜索二维矩阵 II:从暴力到最优解的完整解析

Java版LeetCode热题100之搜索二维矩阵 II&#xff1a;从暴力到最优解的完整解析 本文全面剖析 LeetCode 第240题「搜索二维矩阵 II」&#xff0c;涵盖题目理解、多种解法实现、复杂度分析、面试技巧及实际应用场景。无论你是准备面试的新手&#xff0c;还是希望深入理解算法优化…

C/C++ 将char[] 打印成二进制

逐字节打印成二进制: void print_char_to_binary(char chr) {for (int i 7; i > 0;i--) {char bit (chr >> i) & 1;printf("%d", bit);}printf("\n"); }int main() {char data[] { 0x12,0x3a,0xff };int len 3;for (int i 0; i < len…

2小时,我搭了一套供应链全流程可视化系统,采购、计划、仓库终于对齐了

你是不是也遇到过这种情况&#xff1a;采购说“料已经下了”&#xff0c;计划说“等物料到位才能排产”&#xff0c;仓库说“根本没看到发货信息”……每天各自忙得团团转&#xff0c;用着各自的Excel表格&#xff0c;开完会都说没问题&#xff0c; 结果月底一核对&#xff0c;…

Java版LeetCode热题100之反转链表:从迭代到递归的全面解析

Java版LeetCode热题100之反转链表&#xff1a;从迭代到递归的全面解析 本文深入剖析 LeetCode 第206题「反转链表」&#xff0c;作为后端开发面试的高频必考题&#xff0c;我们将从基础概念到高级技巧&#xff0c;从代码实现到实际应用&#xff0c;全方位掌握这一经典算法。无论…

大模型知识库(1)什么是Claude Skills?

Claude Skills 是 Anthropic 为其大语言模型 Claude 推出的扩展功能模块&#xff0c;可以理解为 Claude 的 “插件” 或 “技能包”&#xff0c;能够让 Claude 在基础对话能力之上&#xff0c;具备特定场景下的专业能力&#xff0c;从而更好地解决复杂任务。一、 Claude Skills…

Java版LeetCode热题100之回文链表:从数组复制到快慢指针的深度解析

Java版LeetCode热题100之回文链表&#xff1a;从数组复制到快慢指针的深度解析 本文全面剖析 LeetCode 第234题「回文链表」&#xff0c;作为面试高频题&#xff0c;我们将深入探讨三种解法的优劣&#xff0c;重点掌握O(1)空间复杂度的最优解。无论你是算法新手还是经验丰富的开…

Java版LeetCode热题100之相交链表:从哈希到双指针的深度解析

Java版LeetCode热题100之相交链表&#xff1a;从哈希到双指针的深度解析 本文全面剖析 LeetCode 第160题「相交链表」&#xff0c;涵盖题目理解、多种解法实现、复杂度分析、面试技巧及实际应用场景。无论你是准备面试的新手&#xff0c;还是希望深入理解链表操作的老手&#x…

Java版LeetCode热题100之环形链表:从哈希表到Floyd判圈算法的深度解析

Java版LeetCode热题100之环形链表&#xff1a;从哈希表到Floyd判圈算法的深度解析 本文全面剖析 LeetCode 第141题「环形链表」&#xff0c;作为面试必考的经典问题&#xff0c;我们将深入探讨两种核心解法&#xff0c;并重点掌握O(1)空间复杂度的Floyd判圈算法。无论你是算法新…

码字1年,我测废了10个AI写小说软件,最后只推荐这5款小说软件生成器!

哈喽大家好&#xff0c;又是我&#xff01; 我之前分享了&#xff0c;后台收到超多私信&#xff0c;都在说&#xff1a;“博主&#xff0c;道理我都懂&#xff0c;但就是下不了笔&#xff01;” 我太懂了&#xff01;真的&#xff01;&#x1f926; 知道要列大纲&#xff0c;…

富文本控件怎样提升XHEDITOR对Word公式粘贴的兼容性?

企业网站Word粘贴与导入功能解决方案 项目概述与技术需求 作为山西IT行业的.NET工程师&#xff0c;我们近期接到一个企业网站后台管理系统的升级需求&#xff0c;主要目标是实现Word内容一键粘贴和文档导入功能。这个功能将极大提升客户的内容发布效率&#xff0c;特别是对于…

不得了!实力天玑AIGEO优化系统代理大揭秘

实力天玑AIGEO优化系统代理大揭秘在数字化营销不断发展的当下&#xff0c;天玑AIGEO优化系统在本地精准营销领域逐渐崭露头角。下面将深入剖析该系统领域的行业痛点、天玑AI互联网中心的技术方案以及应用效果。行业痛点分析当前天玑AIGEO优化系统领域面临着诸多技术挑战。在数字…

Java版LeetCode热题100之环形链表 II:从哈希表到Floyd判圈算法的深度解析

Java版LeetCode热题100之环形链表 II&#xff1a;从哈希表到Floyd判圈算法的深度解析 本文全面剖析 LeetCode 第142题「环形链表 II」&#xff0c;作为面试高频难题&#xff0c;我们将深入探讨两种核心解法&#xff0c;并重点掌握O(1)空间复杂度的Floyd判圈算法及其数学证明。无…

医院HIS系统怎样实现检验报告公式转XHEDITOR在线编辑?

打造Word内容一键转存的CMS新闻管理系统升级方案 大家好&#xff01;我是山西某校软件工程专业的一名大三学生&#xff0c;最近正在给我的CMS新闻管理系统添加一个酷炫的功能——Word内容一键转存&#xff01;&#x1f389; 需求分析 我需要给后台编辑器增加一个按钮&#x…

国防项目如何实现加密Word文档公式安全导入XHEDITOR?

企业网站Word粘贴与导入功能解决方案 作为山西IT行业的PHP工程师&#xff0c;我最近正在评估如何为企业网站后台管理系统集成Word粘贴和文档导入功能。以下是针对这一需求的详细技术分析方案。 需求分析 客户需要实现两个核心功能&#xff1a; Word粘贴功能&#xff1a;从W…

军工领域,JAVA大文件分块上传的示例代码是什么?

我&#xff0c;一个被大文件上传逼疯的大三狗&#xff0c;想和你唠唠毕业设计的血泪史 最近为了做毕业设计&#xff0c;我把头发薅掉了小半——老师要的是“能打”的文件管理系统&#xff0c;核心需求就一条&#xff1a;10G大文件上传&#xff0c;还要支持文件夹、断点续传、加…

站群系统如何处理PDF公式转存为XHEDITOR网页格式?

企业网站Word粘贴与导入功能解决方案 项目概述与技术需求 作为山西IT行业的.NET工程师&#xff0c;我们近期接到一个企业网站后台管理系统的升级需求&#xff0c;主要目标是实现Word内容一键粘贴和文档导入功能。这个功能将极大提升客户的内容发布效率&#xff0c;特别是对于…

医疗领域,JAVA大文件上传与下载的示例步骤?

今天早上有网友加我微信&#xff0c;也是咨询这块的技术问题&#xff0c;最近不知道啥情况&#xff0c;加我的网友还是挻多的。实际上我的微信很早就在网上公开了&#xff0c;但是还是有很多网友说找不到。 昨天晚上论坛里面有位网友发私信给我&#xff0c;聊了一下这个问题&am…