1. corePoolSize -----------------核心线程数量
- 作用:定义了线程池的基本大小。
- 执行流程:当一个新任务提交到线程池时,如果当前运行的线程数小于
corePoolSize,线程池会立即创建一个新线程来执行该任务,即使池中还有其他空闲线程。
2. maximumPoolSize -----------最大线程数量
- 作用:定义了线程池的上限。当任务量激增时,线程池可以创建的最大线程数不能超过此值。
- 执行流程:当工作队列(
workQueue)已满,并且当前运行的线程数小于maximumPoolSize时,线程池会创建新的非核心线程来处理任务。
- keepAliveTime ---------------线程保持时间,N个时间单位
作用:用于回收空闲的非核心线程,避免长时间占用系统资源。
- 执行流程:如果一个非核心线程的空闲时间超过了
keepAliveTime,它就会被终止。当allowCoreThreadTimeOut设置为true时,这个参数也同样适用于核心线程。
4. unit ----------------------------时间单位(比如秒,分)
- 作用:定义
keepAliveTime的时间尺度。 - 可选值:
TimeUnit枚举类中的值,如SECONDS(秒)、MILLISECONDS(毫秒)、MINUTES(分钟)等。
5. workQueue -------------------阻塞队列
- 作用:作为任务的“缓冲区域”,是连接任务提交者和线程池执行者的桥梁。
- 执行流程:当新任务提交时,如果当前运行线程数已达到
corePoolSize,任务会被放入workQueue。队列的类型和容量对线程池的行为有重大影响。 - 常用队列类型:
ArrayBlockingQueue:基于数组的有界阻塞队列,必须指定容量,按 FIFO(先进先出)原则排序。LinkedBlockingQueue:基于链表的阻塞队列,可以是有界的也可以是无界的(默认是Integer.MAX_VALUE),按 FIFO 排序。使用无界队列时,maximumPoolSize参数将失效,因为任务永远不会填满队列去触发创建非核心线程。SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等待一个相应的移除操作,反之亦然。通常需要将maximumPoolSize设置得很大,以避免任务被拒绝。PriorityBlockingQueue:具有优先级的无界阻塞队列。任务会根据其优先级进行排序执行。
6. threadFactory ----------------线程工厂
用于创建新线程的工厂。通过自定义线程工厂,我们可以对新创建的线程进行定制化处理。
- 作用:
- 为线程设置一个有意义的名字,方便问题排查(如通过
jstack查看线程堆栈)。 - 设置线程的守护状态(
setDaemon(true/false))。 - 设置线程的优先级。
- 默认实现:
Executors.defaultThreadFactory(),它会创建名称为pool-N-thread-M的非守护线程。
7. handler -----------------------线程池拒绝策略
- 作用:定义了当线程池无法接受新任务时的处理方式。
- 内置的拒绝策略:
ThreadPoolExecutor.AbortPolicy(默认):直接抛出RejectedExecutionException异常,阻止系统正常工作。ThreadPoolExecutor.CallerRunsPolicy:“调用者运行”策略。既不抛弃任务也不抛出异常,而是将任务回退给调用者(即提交任务的那个线程)来执行。可以有效减缓新任务的提交速度。ThreadPoolExecutor.DiscardPolicy:直接悄悄地丢弃这个任务,不做任何处理和通知。ThreadPoolExecutor.DiscardOldestPolicy:丢弃工作队列中最旧的那个任务(即队头的任务),然后尝试重新提交当前任务