共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(一)

这是线程池的一个典型实现 

public class ThreadPoolExecutor extends AbstractExecutorService 

继承自AbstractExecutorService


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

这个是原子变量 值为RUNNING状态与0的按位或值
    private static final int COUNT_BITS = Integer.SIZE - 3;
这个是计算状态用的位数 为29

    private static final int CAPACITY   = (1 << COUNT_BITS) - 1;
这个是线程池容量 2的29次方减一

    // runState is stored in the high-order bits
    private static final int RUNNING    = -1 << COUNT_BITS;

正在运行状态 用-1左移29位 负数的左移操作的是补码 也就是负数二进制值除了符号位以外 都取反 然后加一得出补码 然后补码左移29位 最后得出一个很大的负数值
    private static final int SHUTDOWN   =  0 << COUNT_BITS;

关闭状态 0左移29位
    private static final int STOP       =  1 << COUNT_BITS;

停止状态 1左移29位
    private static final int TIDYING    =  2 << COUNT_BITS;

整理状态 2左移29位
    private static final int TERMINATED =  3 << COUNT_BITS;
终止状态 3左移29位



    // Packing and unpacking ctl
    private static int runStateOf(int c)     { return c & ~CAPACITY; }

这个是获取状态的方法 返回的是参数按位与CAPACITY取反的结果
    private static int workerCountOf(int c)  { return c & CAPACITY; }
这个是计算worker数目的方法 用参数按位与CAPACITY

    private static int ctlOf(int rs, int wc) { return rs | wc; }

这个是获取上面那个原子变量操作数的方法 返回两个参数按位或的结果


为什么这么麻烦呢?有说法是这些状态位前四位存的是状态 后28位存的是线程数 咱们继续看 


    private static boolean runStateLessThan(int c, int s) {
        return c < s;
    }


    private static boolean runStateAtLeast(int c, int s) {
        return c >= s;
    }


    private static boolean isRunning(int c) {
        return c < SHUTDOWN;
    }

这三个方法都是脱离ctl而判断线程池状态的方法 


    private boolean compareAndIncrementWorkerCount(int expect) {
        return ctl.compareAndSet(expect, expect + 1);
    }


    private boolean compareAndDecrementWorkerCount(int expect) {
        return ctl.compareAndSet(expect, expect - 1);
    }

这两个是ctl的cas方法 涉及增减worker

    private void decrementWorkerCount() {
        do {} while (! compareAndDecrementWorkerCount(ctl.get()));
    }

这个是调用上面的方法给worker数减一 直到返回true为止

你可能感兴趣的:(Java)