Java线程--线程池ctl

本文深入剖析Java线程池的ctl变量,讲解其如何利用32位中的高3位表示运行状态,低5位表示线程数。讨论了ctl在不同状态间的转换,如RUNNING、SHUTDOWN、STOP等,并解析ctl的包装、原子操作及其在管理线程池状态和线程数中的作用。
摘要由CSDN通过智能技术生成

线程池ctl

线程池ctl源码

打开ThreadPoolExecutor的源码(我裁剪掉了一部分),一开始就会发现:

public class ThreadPoolExecutor extends AbstractExecutorService {

    /** 我以一个字节8位来简化解释线程池对运行状态和当前有效线程个数的原子管理方案

     * 线程池当中,用一个ctl原子变量包装了高3位的运行状态和低5位的线程个数
     *
     *   运行状态:  线程池初始化后,就处于该状态:此时,线程池可以接受新任务并且处理任务
     *   关闭状态:  调用shutdown()方法时,就处于该状态:此时,shutdown()方法之后不能再提交新任务,线程池会把shutdown()方法之前提交的任务按照线程池工作原理的步骤都处理完毕。(请参考我的博客:线程池工作原理
     *   停止状态:  调用shutdownNow()方法时,就处于该状态:此时,shutdownNow()方法之后不能再提交新任务,线程池不处理已经提交到任务队列中的任务,线程池尝试中断正在执行的工作线程
     *   整理状态:  线程池内部自己使用的状态:当线程池queue任务队列为空,hashset<worker>为空时,就是该状态,该状态是由关闭状态/停止状态转变而来的。当处于整理状态时,线程池会调用terminated()钩子方法
     *   终结状态:  当钩子方法terminated()执行完毕之后,线程池由整理状态转变为终结状态。钩子方法是线程池自动调用的。
     *
     *   在线程池终结状态之前,可以调用awaitTermination()阻塞方法,使当前主线程阻塞,直至线程状态转变为终结状态
     */ 

 /**
 * The main pool control state, ctl, is an atomic integer packing
 * two conceptual fields
 *   workerCount, indicating the effective number of threads
 *   runState,    indicating whether running, shutting down etc
  *
  * The runState provides the main lifecycle 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, workers is zero,the thread transitioning to state TIDYING
  *   TERMINATED: t

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值