ThreadPoolExecutor简介


Java线程池攻略<一>:初识ThreadPoolExecutor
Java线程池攻略<二>:四种常用线程池剖析

ThreadPoolExecutor是一个 ExecutorService,它运用可能的几个池线程之一履行每个提交的使命,通常运用 Executors 工厂办法配置。

结构参数


类图

Java线程池攻略:初识ThreadPoolExecutor

ThreadPoolExecutor3 个最重要的参数:

  • corePoolSize:中心线程数线程数界说了最小能够一起运转的线程数量。
  • maximumPoolSize:当行列中存放的使命到达行列容量的时分,当前能够一起运转的线程数量变为最大线程数。
  • workQueue:当新使命来的时分会先判断当前运转的线程数量是否到达中心线程数,假如到达的话,新使命就会被存放在行列中。

ThreadPoolExecutor其他常见参数 :

  1. keepAliveTime:当线程池中的线程数量大于corePoolSize的时分,假如这时没有新的使命提交,中心线程外的线程不会立即销毁,而是会等候,直到等候的时刻超过了keepAliveTime才会被收回销毁;
  2. unit:keepAliveTime参数的时刻单位。
  3. threadFactory:executor 创立新线程的时分会用到。
  4. handler:饱满战略。关于饱满战略下面单独介绍一下。

假如当前一起运转的线程数量到达最大线程数量而且行列也已经被放满了使命时,ThreadPoolTaskExecutor界说一些战略:

  • ThreadPoolExecutor.AbortPolicy:抛出RejectedExecutionException来回绝新使命的处理。
  • ThreadPoolExecutor.CallerRunsPolicy:调用履行自己的线程运转使命,也便是直接在调用execute办法的线程中运转(run)被回绝的使命,假如履行程序已封闭,则会丢掉该使命。因此这种战略会下降对于新使命提交速度,影响程序的整体性能。假如您的应用程序能够承受此延迟而且你要求任何一个使命恳求都要被履行的话,你能够挑选这个战略。
  • ThreadPoolExecutor.DiscardPolicy:不处理新使命,直接丢掉掉。
  • hreadPoolExecutor.DiscardOldestPolicy: 此战略将丢掉最早的未处理的使命恳求。

默许情况下是AbortPolicy,抛出异常中断使命。

假如不想抛弃使命,能够用CallerRunsPolicy,相当于供给一个可弹性的行列(使命交给execute办法的线程履行)。

Java线程池攻略:初识ThreadPoolExecutor

源码



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();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}