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()等待关闭完成
相关推荐
咸鱼翻身小阿橙6 分钟前
多线程解析
java·开发语言
AOwhisky17 分钟前
Python 学习笔记(第四期)——字符串:格式化、操作与文本处理——核心知识点自测与详解
开发语言·笔记·python·学习·列表·元组·字典
@@@@@@@@541 小时前
JavaScript 的缺点与 TypeScript 的弥补
开发语言·javascript·typescript
tachibana21 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
神仙别闹1 小时前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法
এ慕ོ冬℘゜1 小时前
深度解析 JavaScript:赋予 Web 灵魂的“全栈语言”
开发语言·前端·javascript
IT乐手1 小时前
Android 写本地日志工具类
android·java
汤米粥1 小时前
Python调用百度搜索触发安全验证
开发语言·python
阿维的博客日记1 小时前
spring里面的@RequestParam什么意思
java·后端·spring
laowangpython2 小时前
昆仑通态 Mcgs Pro软件安装步骤(附安装包)Mcgs Pro 3.3.6 下载安装教程(保姆级)
java·服务器·数据库·其他