news 2026/2/10 5:58:32

一文详解Java中Thread、ThreadGroup 和 ThreadLocal<T> 三者的区别和用途

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文详解Java中Thread、ThreadGroup 和 ThreadLocal<T> 三者的区别和用途

01-Thread (线程)

1.1 核心含义

Thread是Java中表示和管理“线程”本⾝的类;⼀个Thread对象就对应着⼀条独⽴的执⾏路径

1.2 主要作用

并发执行:允许程序同时运⾏多个任务,提⾼资源利⽤率和响应速度
封装任务:将需要并发执⾏的代码封装在⼀个Runnable 对象的 run 方法继承 Thread 后重写的 run 方法

1.3 关键点

生命周期:线程有明确的⽣命周期状态,如 NEW(新建)、RUNNABLE(可运⾏/正在运⾏)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(限时等待)、TERMINATED(终⽌)
控制方法:提供了⼀系列控制线程的⽅法,如 start()(启动)、sleep()(睡眠)、join()(等待该线程结束)、 interrupt()(中断)等
资源共享与同步:多个线程可以共享进程中的资源和内存空间,这也导致了线程安全问题,需要使⽤synchronized、Lock 等机制进⾏同步

使用示例:

// ⽅式1:继承 Thread 类 class MyThread extends Thread { @Override public void run() { System.out.println("线程运⾏了: " + getName()); } } // ⽅式2:实现 Runnable 接⼝ (更推荐,因为更灵活) class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程运⾏了: " + Thread.currentThread().getName()); } } public class Test { public static void main(String[] args) { // 使⽤⽅式1 Thread t1 = new My new MyThread(); t1.start(); // 使⽤⽅式2 Thread t2 = new Thread(new MyRunnable(), "我的线程-2"); t2.start(); } }

⼀句话:Thread就是那条“路”,是任务的执行者本身

02-ThreadGroup (线程组)

2.1 核心含义

ThreadGroup 是⽤来将多个线程组织成⼀个树形结构的“容器”,⽤于对⼀批线程进⾏统⼀的管理和控制

2.2 主要作用

批量管理:可以⽅便地对⼀个组内的所有线程进⾏统⼀操作,如 设置统⼀的异常处理器 (setUncaughtExceptionHandler)、设置最大优先级 (setMaxPriority)、中断组内所有线程 (interrupt)等
层级结构:线程组可以包含子线程组,形成⼀个
树状结构,便于组织和分类

2.3 关键点

安全性:在现代 Java 并发编程中,ThreadGroup 的使用已经大大减少。它的设计初衷部分是为了安全限制(如 Applet),但现在有更好的安全管理器;
功能有限:虽然可以进⾏批量中断,但它并不能提供像线程池那样的资源管理和任务调度能⼒;
逐渐被替代:对于⼤多数现代应用,使用 java.util.concurrent 包下的⼯具(如ExecutorService 线程池)是更强大和推荐的方式来管理和控制线程集合

使用示例:

public class Test { public static void main(String[] args) { // 创建⼀个线程组 ThreadGroup myGroup = new ThreadGroup("我的⼯作组"); // 创建三个线程,并将它们都放⼊ myGroup 中 Thread t1 = new Thread(myGroup, new MyRunnable(), "T1"); Thread t2 = new Thread(myGroup, new MyRunnable(), "T2"); Thread t3 = new Thread(myGroup, new MyRunnable(), "T3"); t1.start(); t2.start(); t3.start(); // 获取线程组中活跃线程数 System.out.println("活跃线程数: " + myGroup.activeCount()); // 中断整个组的线程 // myGroup.interrupt(); } }

⼀句话:ThreadGroup 是⼀个“管理员”,用来把⼀堆 Thread 打包在⼀起进行统⼀管理,但在现代编程中使⽤较少

03-ThreadLocal<T> (线程本地变量)

3.1 核心含义

ThreadLocal<T> 是⼀个泛型类,它提供了线程局部的变量。这些变量与普通变量不同,每个访问该变量的线程都有其自己独立初始化的变量副本,从而实现了线程间的数据隔离

3.2 主要作用

数据隔离:避免在多线程环境下,由于共享变量而导致的线程安全问题。它让每个线程都能独立地改变自己的副本,而不会影响其他线程的副本

传递上下文:在整个线程的执行链路中(如⼀次 Web 请求),⽅便在不同⽅法间传递用户信息、事务 ID、数据库连接等上下⽂数据,而无需在每个方法签名上显式传递

3.3 关键点

原理:它在内部使用了⼀个以Thread为键的 Map (ThreadLocalMap),为每个线程存储其独有的值

内存泄漏风险:如果使⽤的是 ThreadLocal 的强引用,并且线程是线程池中的长生命周期线程,那么当 ThreadLocal 对象不再使⽤时,必须手动调用 remove() ⽅法来清理其对应的 value,否则可能导致内存泄漏

初始化:可以通过重写 initialValue() ⽅法使⽤ withInitial(Supplier)来为每个线程提供⼀个初始值

示例代码(用户上下文传递):

public class UserContextHolder { // 创建⼀个 ThreadLocal 来存放⽤⼾信息 private static final ThreadLocal<User> USER_CONTEXT = new ThreadLocal<>(); public static void setUser(User user) { USER_CONTEXT.set(user); } public static User getUser() { return USER_CONTEXT.get(); } // 在处理完请求后,⼀定要清理,尤其是在使⽤线程池时 public static void clear() { USER_CONTEXT.remove(); } } // 在拦截器或过滤器中... public void doFilter(...) { try { // 从请求中解析出⽤⼾信息 User user = parseUserFromRequest(request); UserContextHolder.setUser(user); // 绑定到当前线程 chain.doFilter(request, response); // 后续业务⽅法可直接获取,⽆需传参 finally { UserContextHolder.clear(); // 确保清理 } } // 在业务层的任何地⽅,都可以直接获取当前请求的⽤⼾ public void someBusinessMethod() { User currentUser = UserContextHolder.getUser(); // ... 使⽤ currentUser }

⼀句话: ThreadLocal<T> 是⼀个“私⼈保险箱”,它为每个线程提供了⼀个只属于它自己的变量副本,实现了线程间的数据隔离方便的上下文传递

04-总结

特性ThreadThreadGroupThreadLocal<T>
核心角色执行者管理者存储器
关注点如何创建和运行一条并发执行的路径如何对一群线程进行批量组织和管理。如何让每个线程拥有自己独立的变量,避免共享冲突
数据关系线程之间可以共享进程的堆内存线程组包含了多个线程为每个线程创建变量的独立副本,实现隔离
现代应用并发基础,但常被高级API(如线程池)封装较少使用,被 Executor 框架取代广泛应用,尤其在 Web 框架中进行上下文传递。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 9:21:11

每日一个C++知识点|异步编程

上篇文章说到C多线程的基础知识, 这篇文章主要说C多线程的另一个重要知识–异步 异步 那么什么是异步呢? 当程序执行一个耗时任务的时候, 主线程硬生生等待线程任务结束,不仅效率低, 还会让程序响应变得卡顿 这时候我们可以使用异步编程来解决这个问题,异步编程的核心就是非阻…

作者头像 李华
网站建设 2026/2/5 22:54:19

探索非线性电液伺服系统:基于ESO的反步滑模控制之旅

非线性电液伺服系统&#xff0c;基于ESO(扩张状态观测器)的反步滑模控制。 pdf教程matlab/simulink源程序。 s—函数搭建 1.通过扩展状态观测器估计速度、加速度和总扰动; 2.根据在线估计的系统模型&#xff0c;设计包含反步控制和滑模控制的控制率&#xff0c;对实际系统进行控…

作者头像 李华
网站建设 2026/2/2 23:30:55

详谈:解释器模式(二)

接上文。看到这个需求&#xff0c;我们很容易想到一种写法&#xff1a;将输入的字符串分割成单个字符&#xff0c;把数字字符通过switch-case转换为数字&#xff0c;再通过计算符判断是加法还是减法&#xff0c;对应做加、减计算&#xff0c;最后返回结果即可。计划的确可行&am…

作者头像 李华
网站建设 2026/2/3 0:28:25

Redis缓存三大问题详解:击穿、穿透与雪崩的解决方案

在使用 Redis 作为缓存层时&#xff0c;我们经常会遇到三个经典问题&#xff1a;缓存击穿、缓存穿透和缓存雪崩。这些问题可能导致系统性能下降甚至崩溃&#xff0c;本文将详细介绍这三个问题的原因和解决方案。一、&#x1f3af; 缓存击穿问题描述&#xff1a;某个热点 key 在…

作者头像 李华
网站建设 2026/2/9 9:01:19

Java赋能AI智能采编:让百万传媒人提早下班的行业变革方案

Java赋能AI智能采编&#xff1a;让百万传媒人提早下班的行业变革方案 在信息爆炸的今天&#xff0c;传媒行业正面临着“素材多到理不清、稿件改到熬大夜、发布急到踩deadline”的普遍困境。数百万传媒从业者坚守在出版、新闻、广播等岗位上&#xff0c;支撑着年产值超2.5万亿元…

作者头像 李华
网站建设 2026/2/3 1:06:09

“蟒蛇书”作者力荐,全球热销的Python入门经典书第3版出版

全新第3版&#xff0c;基于Python 3.13&#xff0c;全球热销75万&#xff0b;&#xff0c;中文版累计销量35万&#xff0c;全书案例素材源代码。零门槛学Python&#xff0c;轻松摆平海量烦琐事务&#xff0c;百万级爆款“蟒蛇书”作者埃里克马瑟斯作序推荐的《Python编程快速上…

作者头像 李华