Java concurrency线程池之线程池原理(三)_动力节点Java学院整理
线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:running, shutdown, stop, tidying, terminated。
线程池状态定义代码如下:
private final atomicinteger ctl = new atomicinteger(ctlof(running, 0)); private static final int count_bits = integer.size - 3; private static final int capacity = (1 << count_bits) - 1; 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; private static int ctlof(int rs, int wc) { return rs | wc; }
说明:
ctl是一个atomicinteger类型的原子对象。ctl记录了"线程池中的任务数量"和"线程池状态"2个信息。
ctl共包括32位。其中,高3位表示"线程池状态",低29位表示"线程池中的任务数量"。
running -- 对应的高3位值是111。
shutdown -- 对应的高3位值是000。
stop -- 对应的高3位值是001。
tidying -- 对应的高3位值是010。
terminated -- 对应的高3位值是011。
线程池各个状态之间的切换如下图所示:
1. running
(01) 状态说明:线程池处在running状态时,能够接收新任务,以及对已添加的任务进行处理。
(02) 状态切换:线程池的初始化状态是running。换句话说,线程池被一旦被创建,就处于running状态!
道理很简单,在ctl的初始化代码中(如下),就将它初始化为running状态,并且"任务数量"初始化为0。
private final atomicinteger ctl = new atomicinteger(ctlof(running, 0));
2. shutdown
(01) 状态说明:线程池处在shutdown状态时,不接收新任务,但能处理已添加的任务。
(02) 状态切换:调用线程池的shutdown()接口时,线程池由running -> shutdown。
3. stop
(01) 状态说明:线程池处在stop状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
(02) 状态切换:调用线程池的shutdownnow()接口时,线程池由(running or shutdown ) -> stop。
4. tidying
(01) 状态说明:当所有的任务已终止,ctl记录的"任务数量"为0,线程池会变为tidying状态。当线程池变为tidying状态时,会执行钩子函数terminated()。terminated()在threadpoolexecutor类中是空的,若用户想在线程池变为tidying时,进行相应的处理;可以通过重载terminated()函数来实现。
(02) 状态切换:当线程池在shutdown状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 shutdown -> tidying。
当线程池在stop状态下,线程池中执行的任务为空时,就会由stop -> tidying。
5. terminated
(01) 状态说明:线程池彻底终止,就变成terminated状态。
(02) 状态切换:线程池处在tidying状态时,执行完terminated()之后,就会由 tidying -> terminated。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。