一、线程池工作原理
二、线程池的参数
1.corePoolSize
核心线程数,默认情况下,线程池中线程的数量如果 <= corePoolSize,那么即使这些线程处于空闲状态,那也不会被销毁
2.maximumPoolSize
最大线程数(核心线程数+非核心线程数),当corePoolSize已满,并且尝试将新任务加入阻塞队列失败(即队列已满)并且当前线程数 < maximumPoolSize,就会创建新线程执行此任务
3.keepAliveTime
当线程池中线程的数量大于corePoolSize,并且某个线程的空闲时间超过了keepAliveTime,那么这个线程就会被销毁
4.unit
keepAliveTime的单位
5.workQueue
工作队列,当没有空闲的线程执行新任务时,该任务就会被放入工作队列中,等待执行
6.threadFactory
线程工厂
7.handler
拒绝策略,当一个新任务提交给线程池,如果此时线程池中有空闲的线程,就会直接执行,如果没有空闲的线程,就会将该任务加入到阻塞队列中,如果阻塞队列满了,就会创建一个新线程,执行当前任务。如果当前线程池中线程的数量等于maximumPoolSize,就不会接着创建新线程,而是执行拒绝策略
三、拒绝策略
1.AbortPolicy
默认策略,直接丢弃任务并抛异常
2.CallerRunsPolicy
使用调用者线程来执行被拒绝的任务
3.DiscardPolicy
直接丢弃任务不抛异常
4.DiscardOldestPolicy
抛弃队列中最老的任务,然后执行当前任务
5.自定义拒绝策略
实现 RejectedExecutionHandler 接口
四、线程池的种类
1.FixedThreadPool
固定大小线程池,核心线程数 == 最大线程数,固定线程数的线程池,阻塞队列为LinkedBlockingQueue(无界队列),它的特点是线程池中的线程数除了初始阶段需要从 0 开始增加外,之后的线程数量就是固定的,适用于服务器后台任务处理,任务量稳定
2.CachedThreadPool
可缓存线程池,核心线程0,最大线程数Integer.MAX_VALUE,阻塞队列使用SynchronousQueue(直接提交任务,队列容量为 0),线程可复用,空闲 60 秒自动回收,适合执行大量短期异步任务,如电商秒杀
3.SingleThreadExecutor
单线程线程池,核心线程数 == 最大线程 == 1,阻塞队列为无界队列,保证所有任务顺序执行,
4.ScheduledThreadPool
可调度线程池,核心线程数 == 最大线程数,固定线程数的线程池,阻塞队列为DelayedWorkQueue延迟队列(无界队列),可以设置定期的执行任务,它支持定时或周期性执行任务
5.SingleThreadScheduledExecutor
单线程可调度线程池,与ScheduledThreadPool类似