ThreadPoolExecutor

简述

当提交一个新的任务(task)时,如果正在运行的线程数量小于CorePoolSize,即使其他线程是空闲的也会创建一个新的线程来执行该任务,如果线程数据大于CorePoolSize小于maximumPoolSize,当队列是满的的时候也会创建新的线程Core线程只有当新的任务(task)到来时才会被创建。当当前的线程数量超过corePoolSize时,空闲的线程会在只能存活KeepAliveTime长的时间

任务提交策略:

当线程数量小于corePoolSize时任务会优先在新创建的线程中执行,
当正在运行的线程数量大于等于corePoolSize时,任务会优先放入任务队列中等待执行,当任务队列满时候才会新建线程,但线程数量不得大于maximumPoolSize,如果此时线程数量已经是maximumPoolSize则不能创建线程,任务被拒绝提交
队列
BlockingQueue:
SynchronousQueue

核心构造函数

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {

corePoolSize:核心线程池大小,线程被创建后会一直保持活跃的数量
maximumPoolSize:允许存在的最大线程数量,当运行线程数量>=corePoolSize,大于corePoolSize的那部分线程在keepAliveTime这么长的时间还没接收到任务就会被中断
keepAliveTime:允许超过corePoolSize小于maximumPoolSize那部分线程在中断之前允许等待新任务的时间
TimeUnit:keepAliveTime 的单位
workQueue:任务队列
threadFactory:创建线程的工厂
handler:当任务到来时没有可用空闲的线程和任务队列已满的情况下使用的拒绝策略
ThreadPoolSize 除了构造函数的几个常用参数外还可以通过setter进行参数设置比如
allowCoreThreadTimeOut 设置为true时,corePoolSize的只能在keepAliveTime的时间段内等待任务,否则也会被回收

线程池的运行状态

runState:

     *   SHUTDOWN: 不接受新的任务, 但是会处理队列中的任务
     *   STOP:     不接受新的任务,也不出来任务队列中的任务,还会中断正在执行中的任务
     *   TIDYING:  所有任务被中断, workerCount 被置为0,允许 terminated() hook method
     *   TERMINATED: 中断完成

     * RUNNING -> SHUTDOWN
     *    On invocation of shutdown(), perhaps implicitly in finalize()
     * (RUNNING or SHUTDOWN) -> STOP
     *    On invocation of shutdownNow()
     * SHUTDOWN -> TIDYING
     *    When both queue and pool are empty
     * STOP -> TIDYING
     *    When pool is empty
     * TIDYING -> TERMINATED
     *    When the terminated() hook method has completed

你可能感兴趣的:(ThreadPoolExecutor)