目录
2.4:newSingleThreadScheduledExecutor
3.5:当线程池的数量达到 corePoolSize 的时候会将多余的线程放入大阻塞嘟咧
3.7:拒绝策略,当线程池数量达到maximumPoolSize的时候会启动
3.7.2:CallerRunsPolicy 将任务抛给调用当前线程池的线程执行
3.7.3:DiscardOldestPolicy 丢弃老的线程
3.7.4:DiscardPolicy 直接丢地,不做任何处理
1:写在前面
在学习一个东西之前(anything)我们都需要明白2点,是什么,为什么,多多思考,学而不思则罔
1.1:什么是线程池
顾名思义,提供,管理线程的池子
1.2:为什么需要线程池
线程是系统的宝贵资源,线程池可以来管理线程的生命周期,创建线程,快捷的调度任务,提高业务的响应速度
2:常见的线程池
2.1:newFixedThreadPool
使用的是LinkedBlockingQueue<Runnable>
2.2:newSingleThreadExecutor
使用的是LinkedBlockingQueue<Runnable>
2.3:newCachedThreadPool
使用的是SynchronousQueue<Runnable>
2.4:newSingleThreadScheduledExecutor
使用的是DelayedWorkQueue<Runnable>
3:线程池重要的7个参数
3.1:初始化线程池的大小
int corePoolSize
3.2:线程池的最大大小,超过的时候,将会启动拒绝策略
int maximumPoolSize
3.3:空闲的线程保持多久会清理
long keepAliveTime
3.4:保留时间单位
TimeUnit unit
3.5:当线程池的数量达到 corePoolSize 的时候会将多余的线程放入大阻塞嘟咧
BlockingQueue<Runnable> workQueue
3.6:线程工厂 ,用来生成线程
ThreadFactory threadFactory
3.7:拒绝策略,当线程池数量达到maximumPoolSize的时候会启动
RejectedExecutionHandler handler
以下为线程池拒绝策略的实现类
3.7.1:AbortPolicy(默认) 抛出异常
3.7.2:CallerRunsPolicy 将任务抛给调用当前线程池的线程执行
3.7.3:DiscardOldestPolicy 丢弃老的线程
3.7.4:DiscardPolicy 直接丢地,不做任何处理
4:需要注意的地方
由于 fix和 single 使用的延迟队列都是LinkedBlockingQueue<Runnable>
而LinkedBlockingQueue<Runnable>在构造的时候会默认使用Integer.MAX_VALUE,虽然看起来是有界的,其实是无界的,因为我们的业务需求在短时间内根本达不到2147483647
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
如果流量巨大无比(速率)的话,队列里面的任务的数量会在短时间内剧增,而线程池中没有那么多的线程来处理相对应的任务,从而堆内存会撑爆,随即产生的就是OOM