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()等待关闭完成
相关推荐
不相心 -w-1 分钟前
Cmake的基础用法
linux·开发语言·c++
编程风暴4 分钟前
3类人群的数据分析实习类型选择+4条选错红线
java·前端·数据分析
钱六两14 分钟前
Spring AI 使用 MCP 客户端(调用高德 MCP)
java·人工智能·spring
撑伞的鱼993715 分钟前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
城管不管21 分钟前
RabbitMQ死信队列
java·分布式·ai·面试·职场和发展·rabbitmq·agent
大数据张老师22 分钟前
Typora 导出 Word 模版操作手册
开发语言·c#·word·typora
略略略咯咯26 分钟前
stream流浅拷贝
开发语言·python
long31628 分钟前
Java 团队入门到精通学习资料
java·开发语言
vx-程序开发31 分钟前
【java项目分享】springboot农产品销售平台14952
java·javascript·spring boot·python·eclipse·django·php
城管不管40 分钟前
rabbitmq如何保证消息不丢失?解决方案又是什么?
开发语言·ai·面试·职场和发展·rabbitmq·php·agent