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

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

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

线程组(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.jsqmd.com/news/248696/

相关文章:

  • Java主流连接池详解:特性、优缺点与适用场景
  • 学霸同款2026继续教育一键生成论文工具TOP9测评
  • Java版LeetCode热题100之搜索二维矩阵 II:从暴力到最优解的完整解析
  • C/C++ 将char[] 打印成二进制
  • 2小时,我搭了一套供应链全流程可视化系统,采购、计划、仓库终于对齐了
  • Java版LeetCode热题100之反转链表:从迭代到递归的全面解析
  • 大模型知识库(1)什么是Claude Skills?
  • Java版LeetCode热题100之回文链表:从数组复制到快慢指针的深度解析
  • Java版LeetCode热题100之相交链表:从哈希到双指针的深度解析
  • Java版LeetCode热题100之环形链表:从哈希表到Floyd判圈算法的深度解析
  • 码字1年,我测废了10个AI写小说软件,最后只推荐这5款小说软件生成器!
  • 富文本控件怎样提升XHEDITOR对Word公式粘贴的兼容性?
  • 不得了!实力天玑AIGEO优化系统代理大揭秘
  • 医院HIS系统怎样实现检验报告公式转XHEDITOR在线编辑?
  • Java版LeetCode热题100之环形链表 II:从哈希表到Floyd判圈算法的深度解析
  • 国防项目如何实现加密Word文档公式安全导入XHEDITOR?
  • 军工领域,JAVA大文件分块上传的示例代码是什么?
  • 站群系统如何处理PDF公式转存为XHEDITOR网页格式?
  • 医疗领域,JAVA大文件上传与下载的示例步骤?
  • 汽车制造行业,JAVA如何实现设计图纸的大文件上传示例?
  • 【文献分享】LyMOI一种结合深度学习和大规模语言模型的用于解读组学数据的工作流程
  • 5.1 办公自动化革命:让AI处理90%的重复性文档工作
  • 5.1 办公自动化革命:让AI处理90%的重复性文档工作
  • 别再手动写代码了!Claude Skills 实战,让 AI 帮你干 80% 的活!
  • 5.3 PPT制作效率爆炸提升:Gamma助力非设计专业也能做出精美演示文稿
  • 5.3 PPT制作效率爆炸提升:Gamma助力非设计专业也能做出精美演示文稿
  • 系统化方法论与实战案例
  • 每日面试题分享140:为什么不选择使用原生的NIO,而是使用Netty?
  • 每日面试题分享140:为什么不选择使用原生的NIO,而是使用Netty?
  • UVM太重了,小项目不需要?