ThreadPoolExecutor 线程池中,线程池的状态有哪些?

1 个回答

  • 高澜
    人一旦不害怕失去,态度就会变得随意,随你意,你随意。
    线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。 ![image.png](https://images.codewd.com/3362b0b24880c94f41e0f45b3c5e8ecf.jpg "image.png") 在 Java 的 `ThreadPoolExecutor` 线程池中,线程池的状态主要有以下几种: 1. **RUNNING(运行中)** - 线程池默认的状态,能够接收新任务并处理队列中的任务。 - 这个状态下,线程池会正常执行任务,不受限制。 2. **SHUTDOWN(已关闭)** - 通过调用 `shutdown()` 进入该状态。 - 不再接收新任务,但会继续处理阻塞队列中的任务。 - 线程池中的线程执行完剩余任务后会被回收。 3. **STOP(停止)** - 通过调用 `shutdownNow()` 进入该状态。 - 不再接收新任务,同时会尝试中断正在执行的任务。 - 会清空任务队列,不再执行其中的任务。 4. **TIDYING(整理中)** - 线程池进入该状态的条件: - `SHUTDOWN` 状态下,任务队列为空,并且所有线程执行完毕。 - `STOP` 状态下,所有线程执行完毕。 - 进入该状态后,会执行 `terminated()` 方法。 5. **TERMINATED(已终止)** - 线程池彻底终止,所有线程资源释放,`terminated()` 方法执行完成。 - 线程池进入 `TERMINATED` 状态的必要条件: - 线程池处于 `TIDYING` 状态,并且 `terminated()` 方法执行完成。 ### 线程池状态转换流程: 1. `RUNNING` → 调用 `shutdown()` → `SHUTDOWN` 2. `RUNNING` → 调用 `shutdownNow()` → `STOP` 3. `SHUTDOWN` → 任务执行完毕 → `TIDYING` 4. `STOP` → 线程执行完毕 → `TIDYING` 5. `TIDYING` → `terminated()` 执行完成 → `TERMINATED` 你可以通过 `ThreadPoolExecutor` 的 `ctl` 状态变量来获取线程池的当前状态,它使用高位存储状态信息: ```java public class ThreadPoolStateDemo { public static void main(String[] args) { ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); System.out.println("初始状态: " + executor.isShutdown()); // false executor.shutdown(); System.out.println("调用 shutdown() 后: " + executor.isShutdown()); // true System.out.println("调用 shutdown() 后: " + executor.isTerminated()); // 可能是 false } } ``` **总结:** - `RUNNING`:接受新任务 & 处理队列任务 - `SHUTDOWN`:不接受新任务,但执行队列任务 - `STOP`:不接受新任务,丢弃队列任务,尝试中断执行中的任务 - `TIDYING`:所有任务执行完毕,准备终结 - `TERMINATED`:线程池完全终止
    发布于 2025-02-04 02:26 •IP属地 黑龙江
    举报
    评论
    收藏