Java线程池的线程池状态以及线程数量表示

本文深入解析Java线程池中线程状态的管理方式,通过32位int类型变量ctl,利用高3位表示线程池状态,低29位表示线程数量。详细解释了RUNNING、SHUTDOWN等状态的二进制表示,以及如何通过位操作获取和设置状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    // runState is stored in the high-order bits

    /**
     * The number of bits used to represent an {@code int} value in two's
     * complement binary form.
     *
     * @since 1.5
     */
    @Native public static final int SIZE = 32;
    
    private static final int COUNT_BITS = Integer.SIZE - 3;

    //-1 左移 32位 ,负数的左移,右边一直补0,所以右边是29个0,-1二进制源码是101,
    //但是计算机使用的是补码,补码为 原码除符号位的各个位取反(110),然后反码+1(111),
    //所以RUNNING=11100000000000000000000000000000
    private static final int RUNNING    = -1 << COUNT_BITS;
    //同样 SHUTDOWN=000 00000000000000000000000000000
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    // 001 00000000000000000000000000000
    private static final int STOP       =  1 << COUNT_BITS;
    // 010 00000000000000000000000000000
    private static final int TIDYING    =  2 << COUNT_BITS;
    // 011 00000000000000000000000000000
    private static final int TERMINATED =  3 << COUNT_BITS;

以上为Java线程池表示线程池状态的方式,为32位的高三位,线程池线程数为32位的低29位。

    // Packing and unpacking ctl

    //获取高三位的值
    private static int runStateOf(int c)     { return c & ~CAPACITY; }
    //获取低29位的值
    private static int workerCountOf(int c)  { return c & CAPACITY; }
    //将高三位和低29位合并 即可得到ctl的值
    private static int ctlOf(int rs, int wc) { return rs | wc; }

举个栗子:

假设线程池状态为RUNNING,有4个线程(WorkerCount)。

ctl = 111 00000000000000000000000000000100

 

此时runStateOf(int c)执行 c & ~ CAPACITY, CAPACITY 值为 (1 << COUNT_BITS) - 1 ,即 00011111111111111111111111111111,ctl 111 00000000000000000000000000000100 和 CAPACITY相与

  CAPACITY 取反:

~ 00011111111111111111111111111111 = 111 000000000000000000000000000000.

~CAPACITY    111 000000000000000000000000000000
          &  
    ctl      111 000000000000000000000000000100

           = 111 000000000000000000000000000000

所得结果只有高三位有可能不全为0,低29一定全为0,这样高三位就可能用来表示线程池的各个状态。

workerCountOf(int c)同理。

ctlOf(int rs, int wc)为将线程池状态和线程池的线程数量的状态合并为ctl.使用上面的例子。

RUNNING:  111 000000000000000000000000000000
        
          |

WorkCount:000 000000000000000000000000000100

          =111 000000000000000000000000000100

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值