Java线程池生命周期

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

一、线程池5种核心状态

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

RUNNINGSHUTDOWNSTOPTIDYINGTERMINATED

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

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

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

  1. 初始状态 :线程池创建后默认是 RUNNING
  2. RUNNINGSHUTDOWN:调用 shutdown() 方法
  3. RUNNINGSTOP:调用 shutdownNow() 方法
  4. SHUTDOWN/STOPTIDYING:任务全部执行完毕/中断,工作线程数为0
  5. TIDYINGTERMINATED:钩子方法 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()等待关闭完成
相关推荐
学习要积极1 小时前
Spring AI Alibaba-ChatClient
java·人工智能·spring
武子康1 小时前
Java-15 深入浅出MyBatis 分页与通用 Mapper 实战:PageHelper + tk.mybatis 从配置到分页查询
java·后端
Kingairy1 小时前
LUA环境搭建
开发语言·lua
z落落1 小时前
C# 虚方法(virtual)与抽象方法 +区别+new方法隐藏 & override方法重写
java·开发语言·c#
宋哥转AI1 小时前
Spring AI Graph:从0到Supervisor(二)并行执行+HITL实战
java·agent
plainGeekDev1 小时前
XML 布局 → Compose 声明式 UI
android·java·kotlin
浮游本尊1 小时前
项目全景 + 第一条完整后端链路
java·前端
jeffer_liu1 小时前
Spring AI 生产级实战:模型选择
java·人工智能·spring boot·后端·spring·语言模型·ai编程
User_芊芊君子1 小时前
【JavaEE】线程入门:线程基础 + 安全机制一次讲透
java·安全·java-ee