主要包含以下七个参数:

1. 核心线程数(corePoolSize)

任务队列未达到队列容量时,可以同时运行的最大线程数量。

2. 最大线程数(maximumPoolSize)

任务队列中存放的任务达到队列容量时,当前可以同时运行的线程数量变为最大线程数。
当任务队列已满且核心线程都在忙时,会创建新线程执行任务,直至达到最大线程数。
例如,设置最大线程数为10,核心线程数为5,当任务队列已满且5个核心线程都忙时,会创建新线程执行任务,最多到10个。

3. 任务队列(workQueue)

新任务到来时,先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务会被存放在队列中。
常见的队列有:有界队列(ArrayBlockingQueue)、无界队列(LinkedBlockingQueue)、优先级队列(PriorityBlockingQueue)。

  • 如果任务量较小且对内存使用不太敏感,希望任务提交永不失败,可以选择 LinkedBlockingQueue
  • 如果需要控制内存使用,防止任务过度积压导致内存不够,可以选择 ArrayBlockingQueue 并为其设置合理的容量。
  • 如果任务有区分优先级,可以选择 PriorityBlockingQueue

4. 空闲线程存活时间(keepAliveTime)

当线程池中的线程数量超过核心线程数时,如果没有新任务提交,核心线程之外的线程不会立即被销毁,而是会等待一段时间直至超过 keepAliveTime,才会被销毁。

5. 时间单位(unit)

用于指定 keepAliveTime 参数的时间单位,例如 TimeUnit.SECONDSTimeUnit.MILLISECONDS 等。

6. 线程工厂(threadFactory)

用于创建新线程,可以自定义线程的属性,例如线程名、优先级等。

7. 拒绝策略(handler)

当线程池无法处理新任务(工作队列已满且线程数量达到最大)时采取的策略。
常见策略如下:

  1. AbortPolicy:默认策略,直接抛出 RejectedExecutionException 异常。
  2. CallerRunsPolicy:让提交任务的线程自己执行任务。
  3. DiscardOldestPolicy:丢弃队列中最旧的未处理任务,然后尝试提交新任务。
  4. DiscardPolicy:直接丢弃新任务,不做任何处理。