Java实习面试笔记:线程池的参数

corePoolSize

线程池核心线程数量,核心线程不会被回收,即使没有任务执行,也会保持空闲状态。如果线程池中的线程少于此数,则在执行任务时创建。

线程池刚创建时,线程数量为0,当每次执行execute添加新的任务时,会在线程池创建一个新的线程,知道线程数量达到corePoolSize为止。

maximumPoolSize

池允许最大的线程数,当线程数量达到corePoolSize,且workQueue队列塞满任务之后,继续创建线程。

线程数量大于corePoolSize但不会超过maximumPoolSize,如果超过maximumPoolSize,就会抛出异常。

keepAliveTime

超过corePoolSize之后的“临时线程”的存活时间。

unit

keepAliveTime的单位

workQueue

当前线程数超过corePoolSize时,新的任务会处在等待状态,并存在workQueue中,BlockingQueue是一个先进先出的阻塞式队列实现。

ThreadFactory

创建线程的工厂类,通常我们会自定一个threadFactory设置线程的名称,这样我们就可以知道线程是由哪个工厂类创建的,可以快速定位。

handler

线程池执行拒绝策略,当线程数量达到maximumPoolSize大小,并且workQueue也已经塞满了任务的情况下,线程池会调用handler拒绝策略来处理请求。

系统默认的拒绝策略有以下集中:

  1. AbortPolicy:线程池默认的拒绝策略,该策略直接抛出异常
  2. DiscardPolicy:直接抛弃不处理
  3. DiscardOldestPolicy:丢弃队列中最老的任务
  4. CallerRunsPolicy:将任务分配给当前执行execute方法线程来处理。

还可以自定义拒绝策略,只需要实现RejectedExecutionHandler接口即可

线程池添加任务的整个流程

  1. 线程池刚刚创建时,线程数量为0
  2. 执行execute添加新的任务时会在线程池创建一个新的线程
  3. 当线程数量达到corePoolSize时,再添加新任务则会将任务放到workQueue队列
  4. 当队列已满放不下新的任务,再添加新任务则会继续创建新线程,但线程数量不超过maximumPoolSize
  5. 当线程数量达到maximumPoolSize时,再添加新任务则会抛出异常。

参考

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.