了解下线程池的5种状态

直接看源码,以下就是源码中定义的线程池的5种状态:

    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    private static final int COUNT_BITS = Integer.SIZE - 3;

    // runState is stored in the high-order bits
    //对应的高3位值是111
    private static final int RUNNING    = -1 << COUNT_BITS;
    //对应的高3位值是000
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    //对应的高3位值是001
    private static final int STOP       =  1 << COUNT_BITS;
    //对应的高3位值是010
    private static final int TIDYING    =  2 << COUNT_BITS;
    //对应的高3位值是011
    private static final int TERMINATED =  3 << COUNT_BITS;

为什么上面标志的是高3位。这是因为以上的变量ctl是一个32位的AtomicInteger类型的原子对象,ctl主要用来记录"线程池中的任务数量"和"线程池状态"这两个信息,其中,高3位就表示着"线程池状态",低29位则表示"线程池中的任务数量",所以就可以理解我上图源码中注释的高3位的意思了,了解即可。

线程池5种状态说明

  • RUNNING:能够接收新任务,并且也能处理队列中的任务。
  • SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理正在执行的任务和队列中的任务。
  • STOP:不接受新任务,也不会处理队列中的任务,同时会中断正在处理任务的线程。
  • TIDYING:当所有的任务已终止,workerCount (有效线程数) 为0时,线程池就处于这个状态。
  • TERMINATED:线程池彻底终止,就变成TERMINATED状态。

线程池状态的流转图

在这里插入图片描述

发布了321 篇原创文章 · 获赞 345 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105436233