线程池的几种状态

线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。

1、RUNNING

(1) 状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。 
(02) 状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
  • 1

2、 SHUTDOWN

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

3、STOP

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

4、TIDYING

(1) 状态说明:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。 
(2) 状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。 
当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。

5、 TERMINATED

(1) 状态说明:线程池彻底终止,就变成TERMINATED状态。 
(2) 状态切换:线程池处在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]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值