Java线程池生命周期

Java线程池(ThreadPoolExecutor)的生命周期核心是5种状态流转 ,状态是不可逆的,线程池一旦关闭就无法再恢复执行任务。我会用最清晰的方式讲透状态定义、流转规则、核心方法和实际表现。

一、线程池5种核心状态

线程池的状态从运行到终止 ,依次为:

RUNNING → SHUTDOWN → STOP → TIDYING → TERMINATED

状态 数值 核心含义 关键行为
RUNNING -1 运行状态 接收新任务 + 处理队列中任务
SHUTDOWN 0 关闭状态 不接收新任务,但继续处理队列中已有的任务
STOP 1 停止状态 不接收新任务 ,不处理队列任务,中断正在执行的任务
TIDYING 2 整理状态 所有任务已终止,工作线程数为0,等待执行terminated()钩子方法
TERMINATED 3 终止状态 terminated()方法执行完毕,线程池彻底死亡

二、状态流转规则(不可逆)

线程池状态只能从小到大递增 ,不能回退:

  1. 初始状态 :线程池创建后默认是 RUNNING
  2. RUNNING → SHUTDOWN:调用 shutdown() 方法
  3. RUNNING → STOP:调用 shutdownNow() 方法
  4. SHUTDOWN/STOP → TIDYING:任务全部执行完毕/中断,工作线程数为0
  5. TIDYING → TERMINATED:钩子方法 terminated() 执行完成

三、控制生命周期的核心方法

1. shutdown() → 优雅关闭

  • 不会暴力中断正在执行的任务
  • 会把队列里剩余的任务执行完
  • 拒绝新任务(抛出RejectedExecutionException)
  • 适用于需要完成遗留任务的场景

2. shutdownNow() → 强制关闭

  • 尝试中断正在执行的任务 (调用interrupt())
  • 不处理队列中剩余任务,并返回未执行的任务列表
  • 拒绝新任务
  • 适用于立即停止、无需保留任务的场景

3. awaitTermination(long timeout, TimeUnit unit) → 等待终止

  • 阻塞当前线程,直到:
    1. 线程池完全终止;
    2. 超时时间到;
    3. 线程被中断。
  • 常用于关闭线程池后,等待任务收尾

4. isShutdown() / isTerminated() → 判断状态

  • isShutdown():是否调用过关闭方法(SHUTDOWN/STOP 都返回true)
  • isTerminated():线程池是否彻底终止 (TERMINATED)

四、完整生命周期代码示例

java 复制代码
import java.util.concurrent.*;

public class ThreadPoolLifeCycleDemo {
    public static void main(String[] args) throws InterruptedException {
        // 1. 创建线程池 → 初始状态:RUNNING
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()
        );

        // 提交任务
        threadPool.execute(() -> {
            try {
                System.out.println("任务执行中...");
                Thread.sleep(1000);
                System.out.println("任务执行完成");
            } catch (InterruptedException e) {
                System.out.println("任务被中断");
            }
        });

        System.out.println("线程池是否运行:" + !threadPool.isShutdown());

        // 2. 调用 shutdown() → 状态:SHUTDOWN
        threadPool.shutdown();

        // 尝试提交新任务 → 拒绝执行
        // threadPool.execute(() -> System.out.println("新任务"));

        // 3. 等待线程池终止(最多等待2秒)
        boolean terminated = threadPool.awaitTermination(2, TimeUnit.SECONDS);
        if (terminated) {
            System.out.println("线程池已彻底终止:TERMINATED");
        }
    }
}

五、关键知识点总结

  1. 状态不可逆:线程池一旦关闭,无法重新恢复为运行状态
  2. 两种关闭方式区别 :
    • shutdown():优雅关闭,处理完队列任务
    • shutdownNow():暴力关闭,中断任务、丢弃队列任务
  3. 终止条件 :所有任务执行/中断完毕 + 所有工作线程销毁 → 进入TERMINATED
  4. 钩子方法 :terminated() 是线程池彻底终止前的最后一个回调方法,可用于资源释放

总结

  1. 线程池生命周期共5个状态:RUNNING → SHUTDOWN → STOP → TIDYING → TERMINATED,且不可逆
  2. 优雅关闭用shutdown(),强制关闭用shutdownNow()
  3. 彻底终止的标志是TERMINATED状态,可通过awaitTermination()等待关闭完成
相关推荐
2501_944521593 分钟前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
meiying883831 分钟前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
@大迁世界1 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust
SEO_juper1 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
南归北隐1 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
学逆向的1 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
古法老登瞎折腾2 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者2 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯2 小时前
啊啊啊啊啊
java·服务器·数据库
SL_staff2 小时前
运维救火实战:钉钉API变更致薪资计算中断,如何用可视化逻辑引擎5分钟热修复
java·开源·全栈