news 2026/5/1 9:03:25

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入浅出线程组和线程优先级
今天我们来简单的介绍一下线程组和线程的关系,以及线程优先级的相关内容。

线程组(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());
运行程序后的输出结果:
所以,如果某个线程的优先级大于线程所在线程组的最大优先级,那么该线程的优先级将会失效,取而代之的是线程组的最大优先级。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 19:27:06

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

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

作者头像 李华
网站建设 2026/4/19 2:06:18

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

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

作者头像 李华
网站建设 2026/4/8 11:46:44

提升小红书转化率的关键:用对聚合系统,回复快人一步

做小红书多号运营的都知道&#xff0c;要反复切换登录回消息&#xff0c;为了赶粉丝活跃高峰&#xff0c;半夜定闹钟爬起来发笔记&#xff0c;第二天顶着黑眼圈上班&#xff1b;更怕深夜有客户问价格、问购买方式&#xff0c;没及时回复就丢了订单……直到小红书聚合管理系统的…

作者头像 李华
网站建设 2026/4/23 5:36:57

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

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

作者头像 李华
网站建设 2026/4/2 10:45:36

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

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

作者头像 李华
网站建设 2026/5/1 8:11:53

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

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

作者头像 李华