什么是线程池
一种池化技术,帮助我们创建,销毁,管理线程。减少线程对象的创建、回收次数,提高服务效率。
为什么要使用线程池
- 降低资源销毁
通过重复利用已经创建的线程,降低线程创建和销毁造成的消耗。
- 提高响应速度
当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性
线程是稀缺资源,如果无限制的创建,不仅会消耗资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。
- 防止服务器过载
防止内存溢出或CPU耗尽。
常用的线程池
可缓存线程池
创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,如无可回收,则新建线程。
定长线程池
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
单线程化的线程池
创建一个单线程化的线程池,它只会用唯一的工作线程去执行任务,保证所有任务按照指定顺序执行。
定期线程池
创建一个定期线程池,支持定时及周期性任务执行。
线程池配置参数
继承关系:
ThreadPoolExecutor类的构造方法:
参数:
corePoolSize:
线程池中的核心线程数量,在没有用的时候也不会被回收。
maximumPoolSize:
线程池中可以容纳的最大线程数量。
keepAliveTime:
线程池中除了核心线程之外的其他线程可以保留的最长时间,即非核心线程可以保留的最长时间。
unit:
计算时间的单位。
workQueue:
等待队列,任务可以存储在等待队列中等待被执行,原则是FIFO(先进先出)。
handler
:拒绝策略。
提交任务的过程:
拒绝策略:
当任务队列满了之后,如果还有任务提交过来吗,会触发
拒绝策略
AbortPolicy:
不执行新任务,直接抛出异常,提示线程池已满,默认该方式。
CallerRunsPolicy:
直接调用execute来执行当前任务。
DiscardPolicy:
丢弃任务,但是不抛出异常。
DiscardOldestPolicy:
抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去。先从任务队列中弹出最先加入的任务,空出一个位置,然后再次执行execute方法把任务加入队列。