corePoolSize
线程池核心线程数量,核心线程不会被回收,即使没有任务执行,也会保持空闲状态。如果线程池中的线程少于此数,则在执行任务时创建。
线程池刚创建时,线程数量为0,当每次执行execute添加新的任务时,会在线程池创建一个新的线程,知道线程数量达到corePoolSize为止。
maximumPoolSize
池允许最大的线程数,当线程数量达到corePoolSize,且workQueue队列塞满任务之后,继续创建线程。
线程数量大于corePoolSize但不会超过maximumPoolSize,如果超过maximumPoolSize,就会抛出异常。
keepAliveTime
超过corePoolSize之后的“临时线程”的存活时间。
unit
keepAliveTime的单位
workQueue
当前线程数超过corePoolSize时,新的任务会处在等待状态,并存在workQueue中,BlockingQueue是一个先进先出的阻塞式队列实现。
ThreadFactory
创建线程的工厂类,通常我们会自定一个threadFactory设置线程的名称,这样我们就可以知道线程是由哪个工厂类创建的,可以快速定位。
handler
线程池执行拒绝策略,当线程数量达到maximumPoolSize大小,并且workQueue也已经塞满了任务的情况下,线程池会调用handler拒绝策略来处理请求。
系统默认的拒绝策略有以下集中:
- AbortPolicy:线程池默认的拒绝策略,该策略直接抛出异常
- DiscardPolicy:直接抛弃不处理
- DiscardOldestPolicy:丢弃队列中最老的任务
- CallerRunsPolicy:将任务分配给当前执行execute方法线程来处理。
还可以自定义拒绝策略,只需要实现RejectedExecutionHandler接口即可
线程池添加任务的整个流程
- 线程池刚刚创建时,线程数量为0
- 执行execute添加新的任务时会在线程池创建一个新的线程
- 当线程数量达到corePoolSize时,再添加新任务则会将任务放到workQueue队列
- 当队列已满放不下新的任务,再添加新任务则会继续创建新线程,但线程数量不超过maximumPoolSize
- 当线程数量达到maximumPoolSize时,再添加新任务则会抛出异常。