# ThreadPoolExecutor 参数说明

ThreadPoolExecutor 构造方法有以下四个,如下图所示:

enter image descriptionhere

其中最后一个构造方法有 7 个构造参数,包含了前三个方法的构造参数,这 7 个参数名称如下所示:

1
2
3
4
5
6
7
8
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}

其代表的含义如下:

#corePoolSize

线程池中的核心线程数,默认情况下核心线程一直存活在线程池中,如果将 ThreadPoolExecutorallowCoreThreadTimeOut 属性设为 true ,如果线程池一直闲置并超过了 keepAliveTime 所指定的时间,核心线程就会被终止。

#maximumPoolSize

线程池中最大线程数,如果活动的线程达到这个数值以后,后续的新任务将会被阻塞(放入任务队列)。

#keepAliveTime

线程池的闲置超时时间,默认情况下对非核心线程生效,如果闲置时间超过这个时间,非核心线程就会被回收。如果 ThreadPoolExecutor
allowCoreThreadTimeOut 设为 true 的时候,核心线程如果超过闲置时长也会被回收。

#unit

配合 keepAliveTime 使用,用来标识 keepAliveTime 的时间单位。

#workQueue

线程池中的任务队列,使用 execute()submit() 方法提交的任务都会存储在此队列中。

#threadFactory

为线程池提供创建新线程的线程工厂。

#rejectedExecutionHandler

线程池任务队列超过最大值之后的拒绝策略, RejectedExecutionHandler 是一个接口,里面只有一个 rejectedExecution 方法,可在此方法内添加任务超出最大值的事件处理。 ThreadPoolExecutor 也提供了 4 种默认的拒绝策略:

  • new ThreadPoolExecutor.DiscardPolicy() :丢弃掉该任务,不进行处理
  • new ThreadPoolExecutor.DiscardOldestPolicy() :丢弃队列里最近的一个任务,并执行当前任务
  • new ThreadPoolExecutor.AbortPolicy() :直接抛出 RejectedExecutionException 异常
  • new ThreadPoolExecutor.CallerRunsPolicy() :既不抛弃任务也不抛出异常,直接使用主线程来执行此任务

# 线程池的工作原理

当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了最大线程数,就会执行拒绝执行策略。

# 线程池关闭

线程池关闭,可以使用 shutdown()shutdownNow() 方法,它们的区别是:

  • shutdown() :不会立即终止线程池,而是要等所有任务队列中的任务都执行完后才会终止。执行完 shutdown 方法之后,线程池就不会再接受新任务了。
  • shutdownNow() :执行该方法,线程池的状态立刻变成 STOP 状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,执行此方法会返回未执行的任务。

# 最后

希望和你一起遇见更好的自己