欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java concurrency线程池之线程池原理(三)_动力节点Java学院整理

程序员文章站 2023-12-15 08:24:22
线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:running, shutdow...

线程有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。 

线程池各个状态之间的切换如下图所示:

Java concurrency线程池之线程池原理(三)_动力节点Java学院整理

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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: