zoukankan      html  css  js  c++  java
  • 线程池的状态整理

    在分析线程池的源码之前,有必要对线程池的几种状态整理一下;

    1:首先看看几种状态的定义:

    //ctl记录了"线程池中的任务数量"和"线程池状态"2个信息

    //ctl共包括32位。其中,高3位表示"线程池状态",低29位表示"线程池中的任务数量"

    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;

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

    // 具体的几种状态对应的高三位的值

    RUNNING    -- 对应的高3位值是111。

    SHUTDOWN   -- 对应的高3位值是000。

    STOP       -- 对应的高3位值是001。

    TIDYING    -- 对应的高3位值是010。

    TERMINATED -- 对应的高3位值是011。

    //几种状态的说明:

    RUNNING

    线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理

    状态切换:线程池初始时状态是RUNNING,一旦线程池创建就处于RUNNING状态,

    下面是线程池初始化的时候执行的:

    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //初始化后任务数是0

    SHUTDOWN

    线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务

    调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN

    STOP

    线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务

    调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP

  • 相关阅读:
    Retrofit2.0+OkHttp打印Request URL(请求地址参数)
    Java如何从HttpServletRequest中读取HTTP请求的body
    解决gradle:download特别慢的问题
    20180531
    20180531 运算符重载
    20180531 二叉树
    20180530
    20180529-2
    20180529-1
    20180529
  • 原文地址:https://www.cnblogs.com/beppezhang/p/11214710.html
Copyright © 2011-2022 走看看