ThreadPoolExecutor 构造函数有以下 7 个参数:
corePoolSize:指定线程池的核心线程数,即线程池中能同时执行的最大线程数。默认情况下,线程池不会立即创建核心线程,而是在有任务提交时才创建,但如果调用 prestartCoreThread 方法,线程池则会在开始执行任务之前立即创建所有核心线程。建议值是 CPU数量 + 1。
maximumPoolSize:指定线程池的最大线程数,即线程池中最多能创建的线程数。当任务队列满时,线程池会继续创建新的线程,直到线程数达到了 maximumPoolSize,此时无法再创建新的线程。建议值是 CPU数量 * 2。
keepAliveTime:指定非核心线程的闲置超时时间,即线程池中的空闲线程在空闲时间超过 keepAliveTime 后会被销毁。这个时间只对非核心线程生效。建议值是 60 秒,或者根据实际任务运行时间进行调整。
unit:表示 keepAliveTime 参数的时间单位,可以选择 TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分钟)等。
workQueue:指定用来保存任务的阻塞队列。常用的有 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue 等。建议使用 LinkedBlockingQueue。
threadFactory:指定创建线程的工厂类。可以使用默认的 Executors.defaultThreadFactory() 方法,也可以自定义线程工厂类。
handler:指定当线程池和任务队列都已经达到上限,无法再提交新的任务时的处理策略。常用的有 ThreadPoolExecutor.AbortPolicy(抛出异常)、ThreadPoolExecutor.DiscardPolicy(直接丢弃任务)、ThreadPoolExecutor.CallerRunsPolicy(在调用者线程中运行任务)等。建议使用 ThreadPoolExecutor.CallerRunsPolicy。