ThreadPoolExecutor 参数最全的构造方法,一共有7个参数:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler){
    ……
}

int corePoolSize,核心线程数

要保留在池中的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut,在这种情况下,最小值为零。

int maximumPoolSize,最大线程数

池中允许的最大线程数。(注意,实际最大值受 CAPACITY 内部限制)

long keepAliveTime,存活时间

当线程数大于核心数时,多余空闲线程(或设置了CoreThreadTimeOut的核心线程)在终止前等待新任务的最长时间(默认纳秒)。

TimeUnit unit,存活时间的时间单位

keepAliveTime参数的时间单位

BlockingQueue workQueue,任务阻塞队列

用于在执行任务之前保存任务的队列。 这个队列将只保存execute方法提交的Runnable任务。常用的阻塞队列如下:
  • LinkedBlockingQueue:默认长度 Integer.MAX_VALUE(2^31-1),也可指定。固定线程数大小的线程池比较常用它作为阻塞队列。是FixedThreadPool、newSingleThreadExecutor默认的阻塞队列。
  • SynchronousQueue:其中每个插入操作都必须等待另一个线程执行相应的移除操作,反之亦然。 同步队列没有任何内部容量,甚至没有容量。不能主动插入,只有消费者等待接收时才能放进去。是CachedThreadPool的默认阻塞队列。
  • DelayedWorkQueue:scheduleThreadPool相关类使用的阻塞队列,根据任务延迟的时间长短对任务进行排序,而不是常规队列的放入顺序。是ScheduledThreadPool、SingleThreadScheduleExecutor的默认阻塞队列。

ThreadFactory threadFactory,线程创建工厂

执行程序创建新线程时使用的工厂,可使用`Executors.defaultThreadFactory()`,也可自定义创建(实现接口的newThread方法)。

RejectedExecutionHandler handler拒绝策略

执行被阻塞时使用的处理程序,因为达到了线程边界和队列容量。常用的拒绝策略如下:

  • ThreadPoolExecutor.AbortPolicy:抛出 RejectedExecutionException来拒绝新任务的处理。
  • ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务,也就是直接在调用execute方法的线程中运行(run)被拒绝的任务,如果执行程序已关闭,则会丢弃该任务。因此这种策略会降低对于新任务提交速度,影响程序的整体性能。如果您的应用程序可以承受此延迟并且你要求任何一个任务请求都要被执行的话,你可以选择这个策略。
  • ThreadPoolExecutor.DiscardPolicy: 不处理新任务,直接丢弃掉。
  • ThreadPoolExecutor.DiscardOldestPolicy: 此策略将丢弃最早的未处理的任务请求。