Java线程池参数介绍
主要包含以下七个参数:
1. 核心线程数(corePoolSize)
任务队列未达到队列容量时,可以同时运行的最大线程数量。
2. 最大线程数(maximumPoolSize)
任务队列中存放的任务达到队列容量时,当前可以同时运行的线程数量变为最大线程数。
当任务队列已满且核心线程都在忙时,会创建新线程执行任务,直至达到最大线程数。
例如,设置最大线程数为10,核心线程数为5,当任务队列已满且5个核心线程都忙时,会创建新线程执行任务,最多到10个。
3. 任务队列(workQueue)
新任务到来时,先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务会被存放在队列中。
常见的队列有:有界队列(ArrayBlockingQueue
)、无界队列(LinkedBlockingQueue
)、优先级队列(PriorityBlockingQueue
)。
- 如果任务量较小且对内存使用不太敏感,希望任务提交永不失败,可以选择
LinkedBlockingQueue
。 - 如果需要控制内存使用,防止任务过度积压导致内存不够,可以选择
ArrayBlockingQueue
并为其设置合理的容量。 - 如果任务有区分优先级,可以选择
PriorityBlockingQueue
。
4. 空闲线程存活时间(keepAliveTime)
当线程池中的线程数量超过核心线程数时,如果没有新任务提交,核心线程之外的线程不会立即被销毁,而是会等待一段时间直至超过 keepAliveTime
,才会被销毁。
5. 时间单位(unit)
用于指定 keepAliveTime
参数的时间单位,例如 TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等。
6. 线程工厂(threadFactory)
用于创建新线程,可以自定义线程的属性,例如线程名、优先级等。
7. 拒绝策略(handler)
当线程池无法处理新任务(工作队列已满且线程数量达到最大)时采取的策略。
常见策略如下:
AbortPolicy
:默认策略,直接抛出RejectedExecutionException
异常。CallerRunsPolicy
:让提交任务的线程自己执行任务。DiscardOldestPolicy
:丢弃队列中最旧的未处理任务,然后尝试提交新任务。DiscardPolicy
:直接丢弃新任务,不做任何处理。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ChatGPT中文站!
评论