
Java线程池ThreadPoolExecutor的生命周期核心是5种状态流转状态是不可逆的线程池一旦关闭就无法再恢复执行任务。我会用最清晰的方式讲透状态定义、流转规则、核心方法和实际表现。一、线程池5种核心状态线程池的状态从运行到终止依次为RUNNING→SHUTDOWN→STOP→TIDYING→TERMINATED状态数值核心含义关键行为RUNNING-1运行状态接收新任务 处理队列中任务SHUTDOWN0关闭状态不接收新任务但继续处理队列中已有的任务STOP1停止状态不接收新任务不处理队列任务中断正在执行的任务TIDYING2整理状态所有任务已终止工作线程数为0等待执行terminated()钩子方法TERMINATED3终止状态terminated()方法执行完毕线程池彻底死亡二、状态流转规则不可逆线程池状态只能从小到大递增不能回退初始状态线程池创建后默认是RUNNINGRUNNING→SHUTDOWN调用shutdown()方法RUNNING→STOP调用shutdownNow()方法SHUTDOWN/STOP→TIDYING任务全部执行完毕/中断工作线程数为0TIDYING→TERMINATED钩子方法terminated()执行完成三、控制生命周期的核心方法1.shutdown()→ 优雅关闭不会暴力中断正在执行的任务会把队列里剩余的任务执行完拒绝新任务抛出RejectedExecutionException适用于需要完成遗留任务的场景2.shutdownNow()→ 强制关闭尝试中断正在执行的任务调用interrupt()不处理队列中剩余任务并返回未执行的任务列表拒绝新任务适用于立即停止、无需保留任务的场景3.awaitTermination(long timeout, TimeUnit unit)→ 等待终止阻塞当前线程直到线程池完全终止超时时间到线程被中断。常用于关闭线程池后等待任务收尾4.isShutdown()/isTerminated()→ 判断状态isShutdown()是否调用过关闭方法SHUTDOWN/STOP都返回trueisTerminated()线程池是否彻底终止TERMINATED四、完整生命周期代码示例importjava.util.concurrent.*;publicclassThreadPoolLifeCycleDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{// 1. 创建线程池 → 初始状态RUNNINGThreadPoolExecutorthreadPoolnewThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue());// 提交任务threadPool.execute(()-{try{System.out.println(任务执行中...);Thread.sleep(1000);System.out.println(任务执行完成);}catch(InterruptedExceptione){System.out.println(任务被中断);}});System.out.println(线程池是否运行!threadPool.isShutdown());// 2. 调用 shutdown() → 状态SHUTDOWNthreadPool.shutdown();// 尝试提交新任务 → 拒绝执行// threadPool.execute(() - System.out.println(新任务));// 3. 等待线程池终止最多等待2秒booleanterminatedthreadPool.awaitTermination(2,TimeUnit.SECONDS);if(terminated){System.out.println(线程池已彻底终止TERMINATED);}}}五、关键知识点总结状态不可逆线程池一旦关闭无法重新恢复为运行状态两种关闭方式区别shutdown()优雅关闭处理完队列任务shutdownNow()暴力关闭中断任务、丢弃队列任务终止条件所有任务执行/中断完毕 所有工作线程销毁 → 进入TERMINATED钩子方法terminated()是线程池彻底终止前的最后一个回调方法可用于资源释放总结线程池生命周期共5个状态RUNNING → SHUTDOWN → STOP → TIDYING → TERMINATED且不可逆优雅关闭用shutdown()强制关闭用shutdownNow()彻底终止的标志是TERMINATED状态可通过awaitTermination()等待关闭完成