推荐:​​Java并发编程汇总​​

Java并发编程一线程池的五种状态

原文地址

​​Java多线程线程池(4)–线程池的五种状态​​

正文

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

线程池各个状态切换框架图:

Java并发编程一线程池的五种状态_阻塞队列

RUNNING

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

SHUTDOWN

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

STOP

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

TIDYING

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

TERMINATED

  1. 状态说明:线程池彻底终止,就变成​​TERMINATED​​状态。
  2. 状态切换:线程池处在​​TIDYING​​​状态时,执行完​​terminated()​​​之后,就会由 ​​TIDYING​​​ -> ​​TERMINATED​​。