线程池工具类 ThreadPoolExecutor 的全参构造函数参数介绍

lianjin 1月前 26

  • ThreadPoolExecutor 全参数构造函数如下
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {....}

参数介绍:

  • corePoolSize:线程池中核心线程数的最大值

  • maximumPoolSize:线程池中能拥有最多线程数

  • workQueue:用于缓存任务的阻塞队列,对于不同的应用场景我们可能会采取不同的排队策略,这就需要不同类型的阻塞队列,在线程池中常用的阻塞队列有以下2种:

    • SynchronousQueue:此队列中不缓存任何一个任务。向线程池提交任务时,如果没有空闲线程来运行任务,则入列操作会阻塞。当有线程来获取任务时,出列操作会唤醒执行入列操作的线程。从这个特性来看,SynchronousQueue是一个无界队列,因此当使用SynchronousQueue作为线程池的阻塞队列时,参数maximumPoolSizes没有任何作用。
    • LinkedBlockingQueue:顾名思义是用链表实现的队列,可以是有界的,也可以是无界的,但在Executors中默认使用无界的。

      以上三个参数之间的关系如下:

    • 如果没有空闲的线程执行该任务且当前运行的线程数少于corePoolSize,则添加新的线程执行该任务。
    • 如果没有空闲的线程执行该任务且当前的线程数等于corePoolSize同时阻塞队列未满,则将任务入队列,而不添加新的线程。
    • 如果没有空闲的线程执行该任务且阻塞队列已满同时池中的线程数小于maximumPoolSize,则创建新的线程执行任务。
    • 如果没有空闲的线程执行该任务且阻塞队列已满同时池中的线程数等于maximumPoolSize,则根据构造函数中的handler指定的策略来拒绝新的任务。

  • keepAliveTime:表示空闲线程的存活时间。

  • unit:表示keepAliveTime的单位。

  • handler:表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略。一般可以采取以下四种取值:

    handler 一般可以采取以下四种取值:


    • ThreadPoolExecutor.AbortPolicy()
      • 抛出RejectedExecutionException异常
    • ThreadPoolExecutor.CallerRunsPolicy()
      • 由向线程池提交任务的线程来执行该任务
    • ThreadPoolExecutor.DiscardOldestPolicy()
      • 抛弃最旧的任务(最先提交而没有得到执行的任务)
    • ThreadPoolExecutor.DiscardPolicy()
    • 抛弃当前的任务

  • threadFactory:指定创建线程的工厂
最后于 1月前 被lianjin编辑 ,原因:
最新回复 (0)
    • Deep♂Dark♂Fantastic
      2
        立即登录 立即注册 
返回