ThreadGroup是轻量级线程逻辑分组机制,用于按业务归类、统一异常捕获、优先级约束及状态监控;支持树形嵌套、集中处理未捕获异常、批量设置新建线程属性。

Java 线程组(ThreadGroup)不是用来替代线程池的调度工具,而是一种轻量级的逻辑分组机制,核心作用是把多个线程按业务、模块或生命周期归类,实现统一标识、异常捕获、优先级约束和基础状态监控。
按功能模块创建专属线程组
每个线程在创建时指定归属的 ThreadGroup,之后不可更改。适合将职责明确的线程流分类管理:
- 订单处理任务统一放入
"order-group" - 日志异步上报线程统一放入
"log-group" - 健康检查心跳线程放入
"health-group"
示例代码:
ThreadGroup orderGroup = new ThreadGroup("order-group");
ThreadGroup logGroup = new ThreadGroup("log-group");
new Thread(orderGroup, () -> System.out.println("订单线程")).start();
new Thread(logGroup, () -> System.out.println("日志线程")).start();
立即学习“Java免费学习笔记(深入)”;
用树形结构做层级隔离
线程组支持父子嵌套,便于构建模块化、可伸缩的隔离体系:
- 主线程默认属于
"main"组,其父组是系统级"system"组 - 可新建
downloadGroup作为子组,再在其下建retrySubGroup - 子组未设置异常处理器时,会自动向上委托给父组
这样既能清晰划分边界,又能复用父级策略,避免重复配置。
集中捕获未处理异常
为整个组重写 uncaughtException(Thread t, Throwable e),代替逐个线程设置处理器:
- 可在其中统一记录错误日志、触发告警、启动降级流程
- 子组不设处理器时,异常会逐级传递,最终由 JVM 默认处理器兜底
示例:
ThreadGroup apiGroup = new ThreadGroup("api-group") {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.err.println("[" + getName() + "] " + t.getName() + " 异常: " + e);
}
};
批量设置属性(仅对新建线程生效)
线程组提供一些批量控制能力,但注意:这些设置只影响后续创建的线程,不改变已运行线程的状态:
-
setMaxPriority(int):限制该组及所有子组中线程的最大优先级 -
setDaemon(true):设为守护组后,当组内无非守护线程存活时,JVM 可正常退出 -
activeCount()和enumerate(threads[])可获取当前活跃线程列表(不含孙子线程)
实际使用中需配合 volatile 关闭标志 + interrupt() 实现协作式关闭,而非依赖已废弃的 stop() 或 destroy()。


















