线程池的五种状态

1、RUNNING

状态说明:线程池处于RUNNING状态时,能够接收新任务以及对已添加的任务进行处理。
状态切换:线程池的初始状态为RUNNING。换句话说线程池一旦被创建,就处于RUNNING状态,且线程池中的任务数为0
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
1
2、SHUTDOWN

状态说明:线程池处于SHUTDOWN状态时,不接收新任务,但能处理已添加的任务
状态切换:调用线程池的shutdown()接口时,线程池由RUNNING->SHUTDOWN
3、STOP

状态说明:线程池处于STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务
状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING)或者(SHUTDOWN)->STOP
4、TIDYING

状态说明:当所有的任务已终止,ctl记录的任务数为0,线程池的状态会变为TIDYING状态;当线程池的状态变为TIDYING状态时,会调用钩子函数terminated(),该方法在ThreadPoolExecutor中是空的,若用户想在线程池变为TIDYING时进行相应的处理,就需要重载terminated()函数实现
状态切换:当线程池状态为SHUTDOWN时,阻塞队列为空并且线程池中执行的任务也为空时,就会由SHUTDOWN->TIDYING
当线程池为STOP时,线程池中执行的任务为空时,就会又STOP->TIDYING
5、TERMINATED

状态说明:线程池彻底终止,就会变成TERMINATED状态
状态切换:线程池处于TIDYING状态时,调用terminated()就会由TIDYING->TERMINATED

<think> 根据引用内容,线程池状态主要有五种:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。下面我将详细解释每种状态的含义及转换条件: 1. **RUNNING(运行中)** - 线程池被创建后的初始状态。 - 此时线程池**能接收新任务**,**能处理已添加的任务**。 - 对应源码中的`ctl`高3位为`111`(二进制)[^1][^2][^4]。 2. **SHUTDOWN(关闭中)** - 调用`shutdown()`方法后进入此状态。 - **不再接收新任务**,但**会继续处理队列中的剩余任务**。 - 若此时调用`execute()`提交新任务,会触发拒绝策略(如`RejectedExecutionException`)[^2][^4]。 3. **STOP(停止中)** - 调用`shutdownNow()`方法后进入此状态。 - **不再接收新任务**,**不再处理队列中的任务**,并**尝试中断正在执行的任务**。 - 队列中的未执行任务会被移出并返回(通过`shutdownNow()`的返回值)[^2][^4]。 4. **TIDYING(整理中)** - 当**所有任务已终止**且**工作线程数为0**时触发。 - 此状态会**自动调用`terminated()`钩子方法**(默认为空,可重写实现自定义逻辑)。 - 转换条件: - 从**SHUTDOWN**转换:任务队列为空且无活动线程。 - 从**STOP**转换:无活动线程[^2][^4][^5]。 5. **TERMINATED(终止)** - 在`terminated()`钩子方法执行完毕后进入此状态。 - 线程池生命周期完全结束,无法重启[^2][^5]。 ### 状态转换示意图 ```mermaid stateDiagram-v2 [*] --> RUNNING RUNNING --> SHUTDOWN : shutdown() RUNNING --> STOP : shutdownNow() SHUTDOWN --> TIDYING : 任务队列空且无活动线程 STOP --> TIDYING : 无活动线程 TIDYING --> TERMINATED : terminated()执行完毕 ``` ### 关键方法对比 | 方法 | 触发状态变化 | 行为特点 | |---------------------|--------------|----------------------------------------| | `shutdown()` | SHUTDOWN | 温和停止:停接新任务,处理存量任务 | | `shutdownNow()` | STOP | 强制停止:停接任务,中断所有任务 | ### 注意事项 - 重写`terminated()`可实现在TIDYING状态的自定义清理逻辑。 - TERMINATED是最终状态,无法回退到其他状态[^4][^5]。 §§相关问题§§ 1. 线程池从SHUTDOWN到TIDYING的条件是什么? 2. `shutdown()`和`shutdownNow()`方法有何区别? 3. 如何在线程池终止前执行自定义清理逻辑? </think> ### 线程池状态详解 根据引用内容,线程池Java 中(如 `ThreadPoolExecutor`)主要有以下五种状态: 1. **RUNNING(运行中)** - 线程池的初始状态,能够接收新任务并处理队列中的任务 - 对应源码:`ctl` 的高 3 位为 `111`(二进制) - 状态值范围:接受新任务 & 处理队列任务[^1][^2] 2. **SHUTDOWN(关闭中)** - 调用 `shutdown()` 方法后进入此状态 - **不再接收新任务**,但会继续处理队列中已存在的任务 - 状态转换:RUNNING → SHUTDOWN[^2][^4] 3. **STOP(停止中)** - 调用 `shutdownNow()` 方法后进入此状态 - **不再接收新任务**,**不再处理队列任务**,并**中断正在执行的任务** - 状态转换:RUNNING/SHUTDOWN → STOP[^2][^4] 4. **TIDYING(整理中)** - 过渡状态,所有任务已终止(包括中断或完成) - 自动触发 `terminated()` 钩子方法(默认空实现,可重写) - 转换条件: - SHUTDOWN → TIDYING:当任务队列为空且无活动线程 - STOP → TIDYING:当所有任务终止[^2][^4][^5] 5. **TERMINATED(终止)** - 最终状态线程池完全结束 - 触发条件:`terminated()` 钩子方法执行完毕 - 状态转换:TIDYING → TERMINATED[^2][^5] ### 状态转换示意图 ```mermaid stateDiagram-v2 [*] --> RUNNING RUNNING --> SHUTDOWN: 调用shutdown() RUNNING --> STOP: 调用shutdownNow() SHUTDOWN --> TIDYING: 任务队列空且无活动线程 STOP --> TIDYING: 所有任务终止 TIDYING --> TERMINATED: terminated()执行完毕 ``` ### 关键特性对比 | 状态 | 接收新任务 | 处理队列任务 | 中断运行中任务 | 触发条件 | |--------------|------------|--------------|----------------|------------------------| | **RUNNING** | ✓ | ✓ | ✗ | 线程池创建时 | | **SHUTDOWN** | ✗ | ✓ | ✗ | 调用 shutdown() | | **STOP** | ✗ | ✗ | ✓ | 调用 shutdownNow() | | **TIDYING** | ✗ | ✗ | ✗ | 任务完全终止时自动进入 | | **TERMINATED**| ✗ | ✗ | ✗ | terminated()执行完成 | > 注:可通过重写 `terminated()` 方法实现状态转换时的自定义逻辑(如资源清理)[^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值