线程池的状态:保存与切换机制

一、线程池状态的保存机制

1.ctl 字段设计(ThreadPoolExecutor 的核心状态变量)

  ctl是一个AtomicInteger,保证在多线程下状态与线程数的更新是原子性的,保存线程池状态+工作线程数量。

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

   实际上它包含两个信息:

  • 高3位:线程池运行状态
  • 低29位:线程数

  定义的状态值:

    // 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;

2.状态提取与操作方法

  • runStateOf(int c):提取高位状态
  • workerCountOf(int c):提取低位线程数量
  • ctlOf(int rs, int wc):生成ctl值

二、线程状态的切换

  线程池的状态分为:RUNNING,SHUTDOWN,STOP,TIDYING,TERMINATED

  RUNNING:运行状态,线程池一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。该状态的线程池会接收新任务,并处理工作队列中的任务;

  • 调用shutdown()方法,可以切换到SHUTDOWN关闭状态;
  • 调用shutdownNow()方法,可以切换到STOP停止状态;

  SHUTDOWN:关闭状态,该状态的线程池不会接收新任务,但会处理工作队列中的任务;

  • 当工作队列为空时,并且线程池中执行的任务也空时,线程池进入TIDYING状态;

  STOP:停止状态,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;

  • 线程池中执行的任务为空,进入TIDYING状态;

  TIDYING:整理状态,该状态表明所有的任务已经运行终止,记录的任务数量为0;

  • terminated()执行完毕,进入TERMINATED状态;

  TERMINATED:终止状态,该状态表示线程池彻底关闭;

  所有状态切换通过compareAndSet方式进行,保证多线程下线程池状态一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值