线程池理解
我们通过线程池可以实现已创建线程的复用,减少资源的消耗;控制并发的数量;以及对线程进行统一的管理。下面我会对线程池的核心参数以及常用的线程池种类进行详细的讲解。
int corePoolSize 核心线程最大数量
核心线程:
- 线程池中有两类线程:核心线程和非核心线程。
- 核心线程默认情况下会一直存在于线程池中,即使这个核心线程什么都不干,而非核心线程如果长时间的闲置,就会被销毁。
int maximumPoolSize 线程总数量最大值
改值等于核心线程数+非核心线程数
long keepAliveTime 非核心线程的闲置超时时间
非核心线程闲置时间超过此值就会被销毁
ThreadFactory threadFactory 线程工厂
创建线程的工厂,用于批量创建线程,如果不指定,会新建一个默认的线程工厂
ThreadPoolExecutor.AbortPolicy
:默认拒绝处理策略,丢弃任务并抛出异常
直接抛出RejectedExecutionException
异常,阻止任务提交
适用场景:需明确感知任务失败的场景(如支付交易、订单处理),需结合异常捕获机制告警。
适用场景:容忍数据丢失的采样场景(如监控指标上报),或任务可异步重试的场景
特点:处理开销最小,但数据丢失风险高,问题排查困难
ThreadPollExecutor.DiscardPolicy
:丢弃新来的任务,但不抛出异常ThreadPollExecutor.DiscardOldestPolicy
:丢弃阻塞队列头部(最旧)的任务,然后重新尝试执行程序,(如果再次失败,重复此过程)。适合实时的新闻等
适用场景:时效性强的任务(如实时消息推送),需优先处理新任务
ThreadPollExecutor.CallerRunPolicy
:由调用的线程去处理改任务。只适用于并发小的情况。- 行为:将任务退回给提交任务的线程(如主线程)执行,若线程池关闭则丢弃任务。适用场景:允许延迟的非关键任务(如日志记录),通过降低提交速度缓解线程池压力