我是靠谱客的博主 笨笨鸵鸟,最近开发中收集的这篇文章主要介绍三. ThreadPoolExecutor原理解析-认识线程池状态,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

本篇文章将结合ThreadPoolExecutor的部分源码,认识ThreadPoolExecutor中的五种线程池状态。

正文

ThreadPoolExecutor继承于AbstractExecutorService,并实现了ExecutorService接口,是Executor框架的核心类,用于管理线程。

ThreadPoolExecutor使用了原子整型ctl来表示线程池状态和Worker数量。ctl是一个原子整型,前3位表示线程池状态,后29位表示Worker数量。ThreadPoolExecutor中这部分的源码如下所示。

public class ThreadPoolExecutor extends AbstractExecutorService {

    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;

    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;

    // 取整型前3位,即获取线程池状态
    private static int runStateOf(int c)     { return c & ~CAPACITY; }
    // 取整型后29位,即获取Worker数量
    private static int workerCountOf(int c)  { return c & CAPACITY; }
    // 根据线程池状态和Worker数量拼装ctl
    private static int ctlOf(int rs, int wc) { return rs | wc; }

    // 线程池状态判断
    private static boolean runStateLessThan(int c, int s) {
        return c < s;
    }

    // 线程池状态判断
    private static boolean runStateAtLeast(int c, int s) {
        return c >= s;
    }

    // 判断线程池状态是否为RUNNING
    private static boolean isRunning(int c) {
        return c < SHUTDOWN;
    }
    
    ......
    
}

总结

ThreadPoolExecutor中规定了线程池的状态如下。

  • RUNNING,线程池接受新任务,会执行任务阻塞队列中的任务,ctl前三位表示为111;
  • SHUTDOWN,线程池拒绝新任务,会执行任务阻塞队列中的任务,ctl前三位表示为000;
  • STOP,线程池拒绝新任务,不会执行任务阻塞队列中的任务,尝试中断正在执行的任务,ctl前三位表示为001;
  • TIDYING,所有任务被关闭,Worker数量为0,ctl前三位表示为010;
  • TERMINATEDterminated()执行完毕,ctl前三位表示为011。

得益于ctl的结构,所以无论Worker数量是多少,ThreadPoolExecutor中线程池状态存在如下关系。

RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED

因此runStateLessThan()runStateAtLeast()isRunning()方法可以方便的对线程池状态进行判断。

最后

以上就是笨笨鸵鸟为你收集整理的三. ThreadPoolExecutor原理解析-认识线程池状态的全部内容,希望文章能够帮你解决三. ThreadPoolExecutor原理解析-认识线程池状态所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部