线程池总共存在5种状态,定义在ThreadPoolExecutor类中,具体代码如下:
public class ThreadPoolExecutor extends AbstractExecutorService {
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;
}
线程池的5种状态具体如下:
(1)RUNNING:线程池创建之后的初始状态,这种状态下可以执行任务。
(2)SHUTDOWN:该状态下线程池不再接受新任务,但是会将工作队列中的任务执行完毕。
(3)STOP:该状态下线程池不再接受新任务,也不会处理工作队列中的剩余任务,并且将会中断所有工作线程。
(4)TIDYING:该状态下所有任务都已终止或者处理完成,将会执行terminated()钩子方法。
(5)TERMINATED:执行完terminated()钩子方法之后的状态。terminated钩子方法在Executor终止时调用,默认实现不执行任何操作
线程池的状态转换规则为:
(1)线程池创建之后状态为RUNNING。
(2)执行线程池的shutdown()实例方法,会使线程池状态从RUNNING转变为SHUTDOWN。
(3)执行线程池的shutdownNow()实例方法,会使线程池状态从RUNNING转变为STOP。
(4)当线程池处于SHUTDOWN状态时,执行其shutdownNow()方法会将其状态转变为STOP。
(5)等待线程池的所有工作线程停止,工作队列清空之后,线程池状态会从STOP转变为TIDYING。
(6)执行完terminated()钩子方法之后,线程池状态从TIDYING转变为TERMINATED。