(一)线程池的优势
总的来说,池化技术都有以下几个优势
1.降低资源消耗:减少了我们频繁地去创建和销毁线程
2.提高响应速度:当任务到达时,任务不需要等待线程的创建,直接拿到一个线程就可以响应
3.便于管理:我们通过线程池统一的去管理我们所有线程,进行统一分配,调优和监控
(二)线程池参数
我们来看一下每个参数都是什么意思
corePollSize(核心线程数):表示我们线程池最少有多少个线程,默认情况下,这些线程是一直存在的。只有达到了核心线程数再来一个任务我们才放到任务队列
maximumPoolSize(最大线程数):表示我们线程池最多能有几个线程,只有当我们任务队列满了,我们才去突破核心线程数,但是线程数要小于最大线程数
keepAliveTime(最大空闲时间):线程池中的非核心线程最大能空闲多久就要被回收
unit(最大空闲时间的单位):指定keepAliveTime的时间单位
wordQueue(任务队列):通过线程池execute()方法提交的任务存储在该参数中,采用阻塞队列实现
threadFactory(线程工厂):一个创建线程的工厂
handler(拒绝策略): 有以下四种
1)AbortPolicy():超出多大线程数,直接抛出异常
2)CallerRunsPolicy():调⽤者负责处理多出来的任务.
3)DiscardOldestPolicy():丢弃队列中最⽼的任务.
4)DiscardPolicy():丢弃新来的任务.
(三)线程池的工作原理
我们用一张图表示
(四)任务队列(workQueue)
任务队列是通过阻塞队列实现的,我们大概分为两种一种是有界队列,一种是无界队列
有界队列:防内存溢出,所以有拒绝策略,也就是我们上面说的拒绝策略
无界队列:任务队列可以一直添加任务,知道内存耗尽,所以此时的最大线程数就没有意义了
那Java给我们提供了7种,我们大概了解一下就可以
(五)线程池的种类
1.定长线程池(FixThreadPool):线程池中线程数量固定,只有核心线程,当所有线程都在忙,任务就会在队列中等待
适用场景:控制线程最大并发数
2.定时线程池(ScheduledThreadPool):核心线程数固定,但是非核心线程数无限,执行完闲置10ms后进行回收
适用场景:执行定时或者周期性任务
3.可缓存线程池(CachedThreadPool):没有核心线程,非核心线程数无限,也就是线程池大小动态调整,线程空闲60s后被回收
适用场景:执行大量,耗时少的任务
4.单线程化线程池(SingleThreadExcutor):只有一个核心线程,没有非核心线程,执行完就回收
适用场景:不适合并发但是可能引起IO阻塞的操作