多线程学习笔记八之线程池

 

  Executor是最基础的执行接口,只提供了一个execute(Runnable command)提交任务方法;ExecutorService接口继承了Executor,在其上做了一些shutdown()、submit()的扩展,可以说是真正的线程池接口AbstractExecutorService抽象类实现了ExecutorService接口中的大部分方法;TheadPoolExecutor继承了AbstractExecutorService,是线程池的具体实现。
  

实现分析

ThreadPoolExecutor类属性

public class ThreadPoolExecutor extends AbstractExecutorService {     // 线程池的控制状态(用来表示线程池的运行状态(整形的高3位)和运行的worker数量(低29位))     private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));     // 偏移量     private static final int COUNT_BITS = Integer.SIZE - 3;     // 最大工作线程数量(2^29 - 1)     private static final int CAPACITY   = (1 << COUNT_BITS) - 1;      // runState is stored in the high-order bits     // 线程运行状态,总共有5个状态,需要3位来表示(所以偏移量的29 = 32 - 3)     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;     // 阻塞队列,存放提交给线程池的任务     private final BlockingQueue<Runnable> workQueue;     // 可重入锁     private final ReentrantLock mainLock = new ReentrantLock();     // 存放工作线程集合     private final HashSet<Worker> workers = new HashSet<Worker>();     // 终止条件     private final Condition termination = mainLock.newCondition();     // 最大线程池容量     private int largestPoolSize;     // 已完成任务数量     private long completedTaskCount;     // 线程工厂     private volatile ThreadFactory threadFactory;     // 拒绝执行处理器     private volatile RejectedExecutionHandler handler;     // 线程等待运行时间     private volatile long keepAliveTime;     // 是否运行核心线程超时     private volatile boolean allowCoreThreadTimeOut;     // 核心池的大小     private volatile int corePoolSize;     // 最大线程池大小     private volatile int maximumPoolSize;     // 默认拒绝执行处理器     private static final RejectedExecutionHandler defaultHandler =         new AbortPolicy(); }

线程池状态

  线程池本身有两个很重要的状态信息:线程池的运行状态和工作线程数,这两个状态信息都包含在变量ctl(int型,32位)中:ctl的高3位表示线程状态runState,低29位表示工作线程worker的数量workCount。线程状态信息如下:

  1. RUNNING:-1<<COUNT_BITS,即高3位为1,低29位为0,该状态的线程池会接收新任务,会处理在阻塞队列中等待处理的任务
  2. SHUTDOWN:0<<COUNT_BITS,即高3位为000,低29位为0,该状态的线程池不会再接收新任务,但还会处理已经提交到阻塞队列中等待处理的任务
  3. STOP:1<<COUNT_BITS,即高3位为001,低29位为0,该状态的线程池不会再接收新任务,不会处理在阻塞队列中等待的任务,而且还会中断正在运行的任务
  4. TIDYING:2<<COUNT_BITS,即高3位为010,低29位为0,所有任务都被终止了,workerCount为0,为此状态时还将调用terminated()方法
  5. TERMINATED:3<<COUNT_BITS,即高3位为011,低29位为0,terminated()方法调用完成后变成此状态

构造方法

  核心参数含义如下:

  • corePoolSize:核心线程数量
  • maximumPoolSize:最大线程数量,可能大于corePoolSize,也可能等于
  • workQueue: 必须是BlockingQueue阻塞队列。当线程池中的线程数超过它的corePoolSize的时候,线程会进入阻塞队列进行阻塞等待。通过workQueue,线程池实现了阻塞功能
  • keepAliveTime:线程池维护线程所允许的空闲时间。当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime。
  • threadFactory:它是ThreadFactory类型的变量,用来创建新线程。默认使用Executors.defaultThreadFactory() 来创建线程。使用默认的ThreadFactory来创建线程时,会使新创建的线程具有相同的NORM_PRIORITY优先级并且是非守护线程,同时也设置了线程的名称。
  • handler:它是RejectedExecutionHandler类型的变量,表示线程池的饱和策略。如果阻塞队列满了并且没有空闲的线程,这时如果继续提交任务,就需要采取一种策略处理该任务。
    public ThreadPoolExecutor(int corePoolSize,                               int maximumPoolSize,                               long keepAliveTime,                               TimeUnit unit,                               BlockingQueue<Runnable> workQueue,                               ThreadFactory threadFactory,                               RejectedExecutionHandler handler) {         if (corePoolSize < 0 ||             maximumPoolSize <= 0 ||             maximumPoolSize < corePoolSize ||             keepAliveTime < 0)             throw new IllegalArgumentException();         if (workQueue == null || threadFactory == null || handler == null)             throw new NullPointerException();         
                    

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信