线程池状态:

线程池的5种状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。

见 ThreadPoolExecutor 源码

// runState is stored in the high-order bits
   private static final int RUNNING    = -1 << COUNT_BITS;
   private static final int SHUTDOWN   =  0 << COUNT_BITS;
   private static final int STOP       =  1 << COUNT_BITS;
   private static final int TIDYING    =  2 << COUNT_BITS;
   private static final int TERMINATED =  3 << COUNT_BITS;

 

1. RUNNING:线程池一旦被创建,就处于 RUNNING 状态,任务数为 0,能够接收新任务,对已排队的任务进行处理。

 

2. SHUTDOWN:不接收新任务,但能处理已排队的任务。调用线程池的 shutdown() 方法,线程池由 RUNNING 转变为 SHUTDOWN 状态。

 

3. STOP:不接收新任务,不处理已排队的任务,并且会中断正在处理的任务。调用线程池的 shutdownNow() 方法,线程池由( RUNNING 或 SHUTDOWN ) 转变为 STOP 状态。

 

4. TIDYING

  • SHUTDOWN 状态下,任务数为 0, 其他所有任务已终止,线程池会变为 TIDYING 状态,会执行 terminated() 方法。线程池中的 terminated() 方法是空实现,可以重写该方法进行相应的处理。

  • 线程池在 SHUTDOWN 状态,任务队列为空且执行中任务为空,线程池就会由 SHUTDOWN 转变为 TIDYING 状态。

  • 线程池在 STOP 状态,线程池中执行中任务为空,就会由 STOP 转变为 TIDYING 状态。

 

5. TERMINATED:线程池彻底终止。线程池在 TIDYING 状态执行完 terminated() 方法就会由 TIDYING 转变为 TERMINATED 状态。

 

状态转换如图

图片

 

JDK 源码中的解释如下

状态:

The runState provides the main lifecyle control, taking on values:

 RUNNING:  Accept new tasks and process queued tasks
 SHUTDOWN: Don't accept new tasks, but process queued tasks
 STOP:     Don'
t accept new tasks, don't process queued tasks,
           and interrupt in-progress tasks
 TIDYING:  All tasks have terminated, workerCount is zero,
           the thread transitioning to state TIDYING
           will run the terminated() hook method
 TERMINATED: terminated() has completed

 

状态间的变化

RUNNING -> SHUTDOWN
  On invocation of shutdown(), perhaps implicitly in finalize()
(RUNNING or SHUTDOWN) -> STOP
  On invocation of shutdownNow()
SHUTDOWN -> TIDYING
  When both queue and pool are empty
STOP -> TIDYING
  When pool is empty
TIDYING -> TERMINATED
  When the terminated() hook method has completed

Threads waiting in awaitTermination() will return when the
state reaches TERMINATED.


更多相关文章

  1. Executors如何创建线程池?
  2. 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
  3. 什么是线程池?
  4. 线程包括哪些状态?状态之间是如何转变的?
  5. 什么是守护线程?
  6. 如何优雅地停止一个线程?
  7. 状态机在移动端项目中的使用
  8. java多线程(11)AtomicBoolean原子类分析
  9. Java基础系列:线程同步和线程池

随机推荐

  1. 学习PHP-cli 模式在终端输出彩色标记文字
  2. 一起看看PHP设计模式之适配器模式
  3. 了解PHP yield的高级用法
  4. Go与PHP的语法是如何对比
  5. php 异常处理有什么用?
  6. 分享一个PHP写的命令行音乐搜索下载器
  7. 关于PHP进程防止内存溢出的排查
  8. php模拟qq登录代码
  9. php base64如何进行URL字符串编码和解码?
  10. PHP实现长轮询【代码示例】